author: selfimpr
mail: lgg860911@yahoo.com.cn
blog: http://blog.csdn.net/lgg201
最近想过一遍PHP的手册, 刚开始就遇到了困难, PHP5.3开始对于fpm的SAPI开始支持.user.ini样式的配置文件(也就是扫描每个目录下的.user.ini来决定使用的配置项), 原来装的是PHP5.2的版本, 在安装5.3的时候遇到了N多问题, 干耗了9个小时, 终于搞定了...写出来分享下, 顺便备忘.
目标: PHP 5.3.5 fpm和cli的SAPI方式都可用.
另安装apc, svn, memcache, memcached, php_libxslt几个扩展
首先是PHP的安装
wget http://cn2.php.net/get/php-5.3.5.tar.gz/from/this/mirror
tar zxvf php-5.3.5.tar.gz
cd php-5.3.5
./configure --prefix=/usr/local --enable-fpm --with-fpm-user=oo-www --with-fpm-group=oo-www --with-pcre-regex --with-zlib --with-bz2 --enable-calendar --with-curl --enable-dba --with-libxml-dir --enable-ftp --with-gd --with-jpeg-dir --with-png-dir --with-zlib-dir --with-freetype-dir --enable-gd-native-ttf --enable-gd-jis-conv --with-mhash --enable-mbstring --with-mysql --with-mysql-sock --with-mysqli --enable-pcntl --with-pdo-mysql --enable-shmop --enable-sockets --enable-sqlite-utf8 --enable-zip --with-pear=/usr/local/lib/php/pear
make ZEND_EXTRA_LIBS='-liconv'
make test
make install
在上面安装PHP的过程中, 我被折磨了超过6个小时, 一开始都是网上找现成的./configure选项还有用原来5.2时候用过的, 总是会有各种问题...
后来, 实在没办法, ./configure --help 把configure的参数逐个看一遍, 大概了解下自己需要的
没有想到的是一次成功了...
make的时候加参数ZEND_EXTRA_LIBS='-liconv'是因为编译时需要iconv库, 但是configure的时候没有写到Makefile中, 还有一种方法是直接修改Makefile, 在链接库的地方(应该在100行左右)加上-liconv
好了, php装好了, 在/usr/local下
make install完成后给出的安装信息如下
Installing PHP SAPI module: fpm //安装的SAPI
Installing PHP CLI binary: /usr/local/bin/ //cli可执行文件
Installing PHP CLI man page: /usr/local/man/man1/
Installing PHP FPM binary: /usr/local/sbin/ //fpm的可执行文件
Installing PHP FPM config: /usr/local/etc/ //fpm配置文件
Installing PHP FPM man page: /usr/local/man/man8/
Installing build environment: /usr/local/lib/php/build/ //构建路径(这个和phpize是编译扩展必须的, 而且此目录必须和phpzie中的路径一致, 注: 可以用文本编辑器打开phpize查看, 我曾经遇到过路径不一致导致扩展不能被编译的情况)
Installing header files: /usr/local/include/php/
Installing helper programs: /usr/local/bin/
program: phpize //编译扩展需要的可执行程序
program: php-config
Installing man pages: /usr/local/man/man1/
page: phpize.1
page: php-config.1
Installing PEAR environment: /usr/local/lib/php/pear/ //pear扩展安装路径
[PEAR] Archive_Tar - already installed: 1.3.7
[PEAR] Console_Getopt - already installed: 1.2.3
[PEAR] Structures_Graph- already installed: 1.0.3
[PEAR] XML_Util - already installed: 1.2.1
[PEAR] PEAR - already installed: 1.9.1
接下来, 配置FPM
fpm会在/usr/local/etc下生成一个php-fpm.conf.default文件, 但是, 实际用的文件名为php-fpm.conf, 需要把这个文件拷贝一份, 修改一下
cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf
主要是打开下面三项(我是开发机, 所以就开的小)
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
然后拷贝ini文件, ini文件在源码目录下有两份
php.ini-development和php.ini-production, 顾名思义, 一个是开发版的, 一个是产品版的..
将其中一个拷贝到/usr/local/lib, 命名为php.ini
cp SOURCE_ROOT/php.ini-development /usr/local/lib/php.ini
由于我是原有项目, 所以, php.ini也带来了一点小纠结
error_report split方法在5.3中过期了, 会报错....另外, 通知级别的错误是不需要报告的...error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
short_open_tag 有哥们儿用了短标签
register_argc_argv 我们有CLI下的应用
enable_dl 需要使用动态链接库
date.timezone = "Asia/Chongqing" 不知道是不是因为装了calendar, 不设置这东西, 就有警告消息
allow_call_time_pass_reference 有哥们调用时传了引用参数
上面是我碰到的一些问题
当然, 其实有两个非常重要的指令需要提一下
include_path = ".:/usr/local/lib/php/pear" 包含路径, 这里我用了当前目录和安装时的pear目录, 应用中可能会需要包含自己的项目路径
extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20090626" 扩展包路径, 下面提到的扩展配置, 如果没有给定路径, 都是基于这个路径来的.(注意: 看清楚那个20090626, 下面会提到我被它也纠结不少时间)
配置基本上就这样完成了, 接下来就是php-fpm程序的启动管理.
源码包中的sapi/fpm提供了init.d.php-fpm, 将它拷贝到/etc/init.d/, 命名为php-fpm
cp SOURCE_ROOT/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
好了, 接下来就可以使用/etc/init.d/php-fpm {start|stop|force-quit|restart|reload}来管理PHP-FPM了
完成了php的安装, 开始扩展的安装吧
我原来用php5.2的时候, 就编译好了扩展的, 直接把so文件拷贝过去, 启动fpm, 报错, 无法加载(这里的报错是因为上面提到的那个20090626, phpize在编译的时候, 会给扩展打上记号, 用php5.2的phpize编译的, php5.3中不能用了哦~~~, 怎么知道一个扩展的这个号呢, 很简单, phpize之后的输出内容中有)
无奈...
只好重新编译
编译的过程中手贱了一下, 用了pecl install apc, 结果又不知道咋了, 用不了....
只好老老实实的从源码重新编译
tar zxvf APC-3.1.6.tgz
cd APC-3.1.6
phpize
./configure
make
make install
其他的扩展安装方式都是一样的, 这里就不再罗嗦了....有一点需要注意的是memcached扩展是依赖于libmemcached的, 所以, 在安装memcached之前, 首先需要安装libmemcached, 并在安装memcached扩展的./configure阶段增加选项--with-libmemcached-dir指定libmemcached的路径
就这么多了....希望可以帮助到大家...上述过程及观点如有错误, 请指正, 以免误导其他朋友...谢谢