centos yiic could not find driver

今天部署线上环境的时候,需要执行定时任务,发现yii的commands无法执行,报出错误如下:

exception 'CDbException' with message 'CDbConnection failed to open the DB connection: could not find driver' in /data/www/framework/db/CDbConnection.php:399

经过查找最终原因是没有安装mysql的pdo驱动,安装命令如下:

yum install php-pdo_mysql

 

FastCgi与PHP-fpm之间是个什么样的关系

首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者。

web server(比如说nginx)只是内容的分发者。比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。好了,如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。Nginx会传哪些数据给PHP解析器呢?url要有吧,查询字符串也得有吧,POST数据也要有,HTTP header不能少吧,好的,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。仔细想想,你在PHP代码中使用的用户从哪里来的。

当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。

好了,CGI是个协议,跟进程什么的没关系。那fastcgi又是什么呢?Fastcgi是用来提高CGI程序性能的。

提高性能,那么CGI程序的性能问题在哪呢?”PHP解析器会解析php.ini文件,初始化执行环境”,就是这里了。标准的CGI对每个请求都会执行这些步骤(不闲累啊!启动进程很累的说!),所以处理每个时间的时间会比较长。这明显不合理嘛!那么Fastcgi是怎么做的呢?首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。

那PHP-FPM又是什么呢?是一个实现了Fastcgi的程序,被PHP官方收了。

大家都知道,PHP的解释器是php-cgi。php-cgi只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理(皇上,臣妾真的做不到啊!)所以就出现了一些能够调度php-cgi进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。好了PHP-FPM也是这么个东东,在长时间的发展后,逐渐得到了大家的认可(要知道,前几年大家可是抱怨PHP-FPM稳定性太差的),也越来越流行。

网上有的说,fastcgi是一个协议,php-fpm实现了这个协议

对。

有的说,php-fpm是fastcgi进程的管理器,用来管理fastcgi进程的

对。php-fpm的管理对象是php-cgi。但不能说php-fpm是fastcgi进程的管理器,因为前面说了fastcgi是个协议,似乎没有这么个进程存在,就算存在php-fpm也管理不了他(至少目前是)。 有的说,php-fpm是php内核的一个补丁

以前是对的。因为最开始的时候php-fpm没有包含在PHP内核里面,要使用这个功能,需要找到与源码版本相同的php-fpm对内核打补丁,然后再编译。后来PHP内核集成了PHP-FPM之后就方便多了,使用--enalbe-fpm这个编译参数即可。

有的说,修改了php.ini配置文件后,没办法平滑重启,所以就诞生了php-fpm

是的,修改php.ini之后,php-cgi进程的确是没办法平滑重启的。php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就可以歇着了,通过这种机制来平滑过度。

还有的说PHP-CGI是PHP自带的FastCGI管理器,那这样的话干吗又弄个php-fpm出

不对。php-cgi只是解释PHP脚本的程序而已。

原文引自

搞不清FastCgi与PHP-fpm之间是个什么样的关系

brew install php56

Dupes

brew tap homebrew/dupes

加入版本

brew tap homebrew/versions

加入PHP

brew tap homebrew/homebrew-php

列出php5.6的选项

brew options php56

好了,开始安装吧,go

brew install php56

在安装的时候,没有顺利的安装成功,碰到倒了如下错误。

 wrong number of arguments (3 for 0..2)

这个错误猜测可能是因为之前已经有安装过的PHP版本,后来把这个给删掉就好了。删除方法点击这里

安装完成之后,记得设置php的lib目录,否则在cli的模式下不能使用最新的。

Error: Failed to update tap: josegonzalez/php

最近很久没有更新brew了,刚才执行了一下

brew update

结果出现了如下错误:

Error: Failed to update tap: josegonzalez/php

错误原因是因为现在php的源发生了变更,所以这里出现了无法更新的问题。解决方案是可以把这个源给删掉。

brew untap josegonzalez/php

当然,删掉之后,需要增加新的源,看一下brew 升级 php56

 

多么扯淡的计划生育政策

现在的计划生育政策,真是坑老百姓的狗屁政策。自己生个孩子,需要办理各种审批,没有准生证,就要征收社会抚养费。孩子是我自己养的,吃穿住看病都是自己花的钱,为什么要给你交社会抚养费?

golang在linux系统上获取terminal终端的宽度

这个方法是在github.com/rakyll/pb的程序中发现的,闲话少说,直接贴代码:

package main

import (
	"fmt"
	"runtime"
	"syscall"
	"unsafe"
)

const (
	TIOCGWINSZ     = 0x5413
	TIOCGWINSZ_OSX = 1074295912
)

type window struct {
	Row    uint16
	Col    uint16
	Xpixel uint16
	Ypixel uint16
}

func terminalWidth() (int, error) {
	w := new(window)
	tio := syscall.TIOCGWINSZ
	if runtime.GOOS == "darwin" {
		tio = TIOCGWINSZ_OSX
	}
	res, _, err := syscall.Syscall(syscall.SYS_IOCTL,
		uintptr(syscall.Stdin),
		uintptr(tio),
		uintptr(unsafe.Pointer(w)),
	)
	if int(res) == -1 {
		return 0, err
	}
	return int(w.Col), nil
}

func main() {
	width, _ := terminalWidth()
	fmt.Print(width)
}

 

golang boom源码分析

boom是一个类似与ab的测试工具。boom起初是Tarek Ziade用python开发的。现在rakyll使用golang重写。

boom安装,使用很简单,详细的安装和使用可以去这个网址看。https://github.com/rakyll/boom

boom的程序很简单,总共代码不到1000行。程序文件有:

  • 入口文件:boom.go,这个文件主要定义了boom接受的参数,main函数,请求网址解析
  • boomer.go 定义了几个结构体
    result struct 包含了每个网址请求后的结果
    ReqOpts struct 包含了请求网址的一些信息,例如:url,method,header等
    Boomer struct 包括了boom的主要信息,例如:请求的次数,并发数,Qps等
  • run.go 总共三个方法:
    Run 执行boom测试
    worker 是每个请求的协程,这里发送请求,获取请求网址的状态,以及计算请求花费的时间
    run 正式执行压力测试,开启规定的协程,启动worker(注意这个方法与上面的Run不一样)

总结:

  1. 学到了golang匿名实例化struct,并且执行struct的方法
  2. 对flag包、WaitGroup的用法有了深刻认识

ps:这个程序引用了一个pd的包,pd是在终端下的进度条。

北漂租房的那些事

来北京快5年了,租过好几处房子,每次总是闹的挺不开心的。似乎这些中介公司和所谓的二房东都是一样,总是那么蛮不讲理。

记得最早2010年在丰台租的一个小隔断间,那时候350一个月,交三押一。刚来北京,手里也没钱而且工资也不高。只能租个便宜的房子。这个小屋子,没有窗户,也不太透气。似乎就像一个盒子一样,有些闷。不过这只是一个睡觉的地方,白天上班,周末回家。租期到了,退房的时候,中介公司压了一个月租金不给退。说是没有交中水费,对于中水费,我不理解。他们解释道说是冲厕所的水钱。跟他们闹了一会,退了200元,还是扣了一些。

在2012年在学院路,在一个所谓的二房东那里租的房子,租金1000每月,交三押一。住了一年退房的时候,也是扣了你一些。押金没全部拿回。。

2013年公司换了地方,住的地方也换了。就搬到了四惠百子湾那里,继续租了一个隔断间,房租500。还是在小中介那里租的房子,后来退房,押金还是没有退我。说是我们没有交水费。这次我去了物业那里问了水费,还打印了水费单子,中介那帮人直接就说:就是不退你押金。我打电话报警,警察来了,录了一下口供,说:你们这事情,需要去法院解决~~为了500,我还要去法院,后来也就算了。中国的警察,唉~~

2013年6月份,从四惠搬到了天通苑,在这里找的也是小中介公司,这次租的是一个次卧,房租1100。14年退房的时候,这家中介公司关门了。原公司的业务都给了另外一家公司。那时候正赶上北京整顿群租房,很多住户也都被敢了出来。租户那天去得也不少,大概有十几户,二十来人。我们到新的中介公司,这帮人都五大三粗的,还有纹身。这家公司不给退的理由是:你们去找上家公司,那家公司押金没有给我们。我给当初租房的那个哥们打了电话,他说:租金就给新的公司了。然后让他们在电话里对峙,结果新的公司的那哥们,张口就骂。。大家没办法,有人叫了警察。我心里知道,又没戏了,警察根本就不管这事。。警察来了,过来跟大家扯了会,还是不了了之了~~

2014年中旬,决定不在租那些小中介公司和所谓二房东的房子,这次租的是我爱我家的房子,租的主卧,房租2000。那些所谓的小中介,租房的时候说没有中介费,退房的时候,会找各种理由不退给你,反而弄一肚子气。大中介租房就跟你说了:我要一个月中介费。反正都是被强奸,只不过我大中介是先告诉你:我要强奸你;小中介是说:我们交个朋友吧,然后在强奸你。。当然,租期还没到,不知道退房的时候会不会依然不退我押金。 不过在中介公司,有一样好处,就是屋里出了什么问题,找人维修很方便,而且不会乱收水费,也没有所谓的垃圾处理费,还会有客服人员对他们公司的服务进行回访。

北漂一族不容易,上班工作累,还要乘坐那不是人做的地铁,还要经常被骗。真希望有关部门能治理一下。

MySQL删除/更新数据时报1175错误

今天删除数据的时候,报了如下错误:

Error Code:1175.You are using safe update mode and you tried to update a table without a WHERE that uses a key column To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.

后来查了资料,发现mysql有SQL_SAFE_UPDATES的变量,这是为了数据库操作的安全。此值默认设置为1,所以才会出现更新失败的情况。

下面是SQL_SAFE_UPDATES变量为0和1时的取值说明:

SQL_SAFE_UPDATES有两个取值0和1,

SQL_SAFE_UPDATES = 1时,不带where和limit条件的update和delete操作语句是无法执行的,即使是有where和limit条件但不带key column的update和delete也不能执行。

SQL_SAFE_UPDATES = 0时,update和delete操作将会顺利执行。

所以,出现1175错误的时候,可以先设置SQL_SAFE_UPDATES的值为0或者使用主键作为where条件删除或者更新。

imagecopyresized和imagecopyresampled的区别

imagecopyresized和imagecopyresampled都是拷贝部分图像并调整大小,但是这两个函数有一个很大的区别,就是imagecopyresized生成的图像不如imagecopyresampled清晰,但是imagecopyresized生成的速度要比imagecopyresampled快,图片要比imagecopyresampled小。

PHP实现下载文件

$fileName = "text.pdf";
$file = fopen ($fileName, "r" );
//输入文件标签
Header ("Content-type: application/octet-stream");
Header ("Accept-Ranges: bytes");
Header ("Accept-Length: " . filesize ($fileName));
Header ("Content-Disposition: attachment; filename=" . time() . ".pdf");
//输出文件内容
//读取文件内容并直接输出到浏览器
echo fread ($file, filesize ($fileName));
fclose ($file);

 

ubuntu运行locale命令报错

报错如下:

root@AY1211110910427107334:~# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE=zh_CN.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

解决方案:

sudo locale-gen zh_CN.UTF-8
sudo dpkg-reconfigure locales

如果上面命令还是提示失败,还一下语言。比如:

sudo locale-gen en_US.UTF-8
sudo dpkg-reconfigure locales

 

php curl 直接导致进程崩溃的问题

刚才在项目中,图片上传的地方,碰见了一个很奇葩的问题。项目的图片会通过curl上传到其它部门的接口。结果在上传的时候,直接导致进程都死了。。收到了如下的错误:8DFA5F21-FF5B-4034-8001-305C9D4EAF04

 

结果就在google上查了很久,无解。。。在apache上收到的错误,也仅仅有这么一句话:

[Thu May 21 16:35:48.050307 2015] [core:notice] [pid 7084] AH00052: child pid 7095 exit signal Segmentation fault (11)

不过发现在apache的errorlog上有这么一句话:

PHP Warning:  Module 'http' already loaded in Unknown on line 0

这个http的module是在项目中用的一个httpRequest的封装。。那么就试着在php.ini中将这个module暂时禁用,发现curl居然好用了。。难道是因为php在启动的时候,这个warning导致的curl不能用了?看来在php启动的时候,warning还是要解决掉。以免引起其它的问题。。。