作者归档:kevin

PHP5下安装sqlite模块的小问题

今天在用pecl为PHP5编译安装sqlite模块的时候,遇到了下面这个错误而编译不过去

sqlite.c:56: error: ‘BYREF_NONE’ undeclared here (not in a function)

GOOGLE一番,原来这是个从2006年7月就存在的BUG。虽然官方在pecl.php.net的关于此bug的详情页里说已经修复了,但不止一个人在1年甚至2年后依然表示错误依旧~!看来老外干活也会偷懒啊,出了sqlite3的模块,老的sqlite模块就不维护了,哎~~

在那个页面里,也有人提供了自己修复此BUG的方法:
1,来到PHP安装目录内的bin目录下

cd /usr/local/php-5.2.3/bin

2,下载这个模块的源码

pecl download sqlite

3,解压并开始编译

$ tar zxvf SQLite-1.0.3.tgz
$ cd SQLite-1.0.3
$ ../phpize
$ ./configure –with-php-config=/usr/local/php-5.2.3/bin/php-config
$ make

4,在make的过程如报告以上错误则编辑sqlite.c文件,将下面这行注释掉

/* static unsigned char arg3_force_ref[] = {3, BYREF_NONE, BYREF_NONE, BYREF_FORCE }; */

然后将下面这三行

function_entry sqlite_functions[] = {
PHP_FE(sqlite_open, arg3_force_ref)
PHP_FE(sqlite_popen, arg3_force_ref)

改为:

function_entry sqlite_functions[] = {
PHP_FE(sqlite_open, third_arg_force_ref)
PHP_FE(sqlite_popen, third_arg_force_ref)

5,重新编译

$ make
$ make install

将编译生成的sqlite.so文件,复制到extension_dir指定的目录中,编辑php.ini文件,加入如下一行

extension=sqlite.so

重启web服务后即可

HowTo: Install Nginx and php-fpm on Linux

最近要为公司搭建新的开发环境,打算舍弃用了n年的apache,换换口味,装个nginx试试。
在网上找了很多文档,没有一个能让我顺利安装完成的。还是自己来整理整理吧……

1,Install Pcre

来这里获取Pcre的最新版本
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/

#tar -zxf pcre-7.8.tar.gz
#cd pcre-7.8
#./configure
#make
#make install

2. Install Nginx(http://www.nginx.net/)

#tar -zxf nginx-0.6.32.tar.gz
#cd nginx-0.6.32
#./configure –prefix=/usr/local/nginx-0.6.32
#make
#make install

3. Install PHP with php-fpm (http://www.php.net/)

nginx是通过fastcgi来支持PHP的,使用php-fpm补丁是一个比较方便的管理fastcgi进程的解决方案。
比通过脚本或是lighttpd的spawn模块要简单的多。

下载好PHP后,来这里获取与PHP版本相对应的php-fpm补丁:http://php-fpm.anight.org/

#tar -zxf php-5.2.6.tar.gz
#cd php-5.2.6
#zcat ../php-5.2.6-fpm-0.5.8.diff.gz | patch -p1  #为PHP打补丁
#./configure –prefix=/usr/local/php-5.2.6 –with-sqlite=shared –enable-fastcgi –enable-fpm
#make
#make install
注:PHP的其他模块(如mysql、gd等)请按需自己配置

#cp php.ini-recommended /usr/local/php-5.2.6/lib/php.ini

修改php.ini

cgi.fix_pathinfo=1

4. Configuring

A. 配置nginx,在/usr/local/nginx-0.6.32/conf目录下新建名为php_fcgi.conf的文件,内容如下:

location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

修改nginx.conf文件,在需要支持PHP的虚拟主机配置中,加入如下一行:

include php_fcgi.conf;

B. 配置php-fpm模块,编辑/usr/local/php-5.2.6/etc/php-fpm.conf文件
找到“Unix user of processes”和“Unix group of processes”两段,将前面注释去掉,并将值改为与nginx配置相同的用户和组。如下:

Unix user of processes
<value name=”user”>www</value>

Unix group of processes
<value name=”group”>www</value>

5. Test and Over

至此,所有安装配置的工作都已经完成。运行下面两行命令来启动nginx和php-fpm服务:

/usr/local/php-5.2.6/sbin/php-fpm start
/usr/local/nginx-0.6.32/sbin/nginx

正确配置后,phpinfo() 页应如下显示:
phf.png
CGI/FastCGI work as Server API
phf2.png

由于文件内容太长,nginx.conf和虚拟主机的配置文件的内容就不放上来了
将这些乱七八糟的配置文件和php-fpm.conf一起打个包,放在这里提供下载吧

http://rui7905.googlecode.com/svn/trunk/nginx_php_fpm

在这一堆东西里,还有一个名为nginx.sh的启动控制脚本。
当确认nginx和php-fpm均正确的配置并可以正常运行后,可以使用此脚本进行日常维护。

卡门 – Habanera

郁闷了一晚上的魔兽,关了游戏下线,也不知怎么就点了个“我猜” 的视频,片段里的Judy’s乐团简直把口琴玩疯了。
GOOGLE到了Judy’s的官方网站,于是乎。。。

从Judy’s的口琴到无名的小号,又到Maria Callas的歌剧片段,居然整整听了3个小时的卡门(Habanera),醉了醉了,彻底醉了……

伟大的比才,你不是一个人!!

无名小号版

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

Judy’s口琴版

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

Maria Callas现场演绎的 卡门 habanera

亲爱的宝贝,如果你能活着,一定要记住我爱你

从5月12日在办公室内感受到大地的颤动到现在,已经整整7天了。一直想为汶川大地震写点什么,可总觉得一切的文字和语言在面对这一切的时候,是那么的苍白和无力。

直到今天下午打开GoogleReader,看到朋友博客上这个短短的文字,眼泪已经没有感觉的侵蚀了我的面容。。。。

抢救人员发现她的时候,她已经死了,是被垮塌下来的房子压死的,透过那一堆废墟的的间隙可以看到她死亡的姿势,双膝跪着,整个上身向前匍匐着,双手扶着地支撑着身体,有些象古人行跪拜礼,只是身体被压的变形了,看上去有些诡异。救援人员从废墟的空隙伸手进去确认了她已经死亡,又在冲着废墟喊了几声,用撬棍在在砖头上敲了几下,里面没有任何回应。当人群走到下一个建筑物的时候,救援队长忽然往回跑,边跑变喊“快过来”。他又来到她的尸体前,费力的把手伸进女人的身子底下摸索,他摸了几下高声的喊“有人,有个孩子,还活着”    经过一番努力,人们小心的把挡着她的废墟清理开,在她的身体下面躺着她的孩子,包在一个红色带黄花的小被子里,大概有3、4个月大,因为母亲身体庇护着,他毫发未伤,抱出来的时候,他还安静的睡着,他熟睡的脸让所有在场的人感到很温暖。 随行的医生过来解开被子准备做些检查,发现有一部手机塞在被子里,医生下意识的看了下手机屏幕,发现屏幕上是一条已经写好的短信“亲爱的宝贝,如果你能活着,一定要记住我爱你”,看惯了生离死别的医生却在这一刻落泪了,手机传递着,每个看到短信的人都落泪了。

我们不知道她的姓名,但是她有一个我们每个人心里最熟悉的名字–“妈妈”。在灾难面前,母爱孕育了一个个看似不可能的奇迹!
祝福孩子能健康成长,也祝愿这位母亲一路走好~

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

为什么我要留在北京?

每次过年回家,都觉得家里好,可是假期一过大家又从四面八方涌来北京。

2年了,舅舅催我回家乡催的跟催命一样。

来北京6年了,这六年,虽然从未失过业,但心里却越来越觉得写程序不应该是我这一辈子的工作。
依靠着每天的敲敲打打,收入应该还算过得去,却一直也没攒下几个钱。

这两年,在心里一直在对自己说这样的收入在 家乡能生活得如何如何的好
家乡的交通如何如何的便利,家里的房子可以随便的住
可还是一直留在了北京,不知道为什么,可能是自尊心不允许自己回去吧。。。。

真是很纳闷,北京, 到底有什么在吸引我,还有很多如同我的你们??

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

转载:优化PHP代码的40条建议

转载自http://www.yeeyan.com/
原作者: Reinhold Weber 原文 译者: davidkoree

1.如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。

2.echo 比 print 快。

3.使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。

4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。

5.注销那些不用的变量尤其是大数组,以便释放内存。

6.尽量避免使用__get,__set,__autoload。

7.require_once()代价昂贵。

8.在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

9.如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

10.函数代替正则表达式完成相同功能。

11.str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

12.如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

13.使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

14.用@屏蔽错误消息的做法非常低效。

15.打开apache的mod_deflate模块。

16.数据库连接当使用完毕时应关掉。

17.$row[‘id’]的效率是$row[id]的7倍。

18.错误消息代价昂贵。

19.尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。

20.在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

21.递增一个全局变量要比递增一个局部变量慢2倍。

22.递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

23.递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

24.仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

25.方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

26.派生类中的方法运行起来要快于在基类中定义的同样的方法。

27.调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

28.用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。

29.输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

30.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

31.除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

32.尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

33. 当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。

(举例如下)
if (strlen($foo) < 5) { echo “Foo is too short”; }
(与下面的技巧做比较)
if (!isset($foo{5})) { echo “Foo is too short”; }

调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

34. 当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

35.并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

36.并非要用类实现所有的数据结构,数组也很有用。

37.不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

38.当你需要时,你总能把代码分解成方法。

39.尽量采用大量的PHP内置函数。

40.如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。

41.评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。

42.mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。

43.另一篇优化PHP的精彩文章,由John Lim撰写。

郁闷的一周

前两天喝咖啡,结果一杯滚烫的咖啡,全洒在了笔记本电脑上。

今天终于修好了,结果早上一脚又把眼镜给踩了个稀巴烂。中午花了675大元重新配了一幅。

MLGB,最近倒霉事这么多,一件接着一件。看来2008起码对我来说,应该是不是啥好年头。哎~~~

上帝保佑,阿弥陀佛

豆瓣 周杰伦的青花瓷

周董又出新专辑了。我对这个不是太感冒,能勾起我兴趣的,是新专辑里的一首中国风–青花瓷。
看完新闻,毫不犹豫找来听,的确还是蛮好听,OY~

很早就知道豆瓣这个网站,不过因为昨天的《色戒》,直到今天才开始关注起来,在上面泡了一上午。

就着《青花瓷》 看了一上午的豆瓣,有种久违了的感觉。记得上高中的时候,在济南文东路上,有家三联书店。书店的一角,是个卖CD的小店,店面不大,大概也就几个平方的样子。在这里能够听到平时很少有机会听到的一些现在所谓的“高雅音乐”。比如小提琴曲、钢琴曲等等,当然琵琶、古筝这些中国风也少不了。中午吃过饭,我经常自己跑来这里,看看书,听听小曲儿,那时候也不懂得什么高雅和小资,就是觉得舒服。现在想想,貌似自己心底里那仅有的一点点小资情调原来是那个时候就培养出来的。

最近貌似比较骚。。。。而且是发自内心的骚,哎,冬天来了的原因?恩,春天不远了,不远了~!

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。