编译PHP加速器eAccelerator
eAccelerator是一款开源PHP加速器,优化动态内容缓存,提高php脚本的缓存性能,使PHP脚本在编译的状态下,对服务器的开销几乎完全消除;另外,可以实现脚本优化,加快脚本执行速率,最终使PHP程序代码执行效率提高1至10倍。
eAccelerator-0.9.5版本支持PHP进行交叉编译,但是该版本不支持动态模块加载方式,只能将eaccelerator编译进libphp5.so动态库中。
将解压得到的eaccelerator-0.9.5目录重命名为eaccelerator,并复制到php-5.2.17/ext目录下,进入该目录,使用phpize工具生成configure文件,phpize是安装PHP时自动生成的工具,默认安装于/usr/local/bin目录下。
/usr/local/bin/phpize
执行成功后,系统提示信息如下:
将php-5.2.17/目录下的configure文件删除,使用buildconfig工具重新生成包含eaccelerator编译选项的configure文件。首先,系统必须安装了autoconf-2.13工具,若未安装,可以通过apt-get工具自动安装。执行下述命令:
apt-getinstall autoconf-2.13
rm configure
./buildconf --force
生成的configure文件包含了eaccelerator的配置语句--enable-eaccelerator。
重新执行PHP配置命令,并在最后加上--enable-eaccelerator参数。执行make时将出现如下错误:
该错误可通过下述方法进行修改:
修改eaccelerator目录下mm.c文件,在文件开始处加入如下语句:
#defineMM_SEM_IPC 1
#defineMM_SHM_IPC 1
设置完成后,重新编译安装eAccelerator,问题解决。
要使PHP能够运行eAccelerator,首先,需要修改php.ini配置文件,并加入eaccelerator的配置信息,在该文件最后添加如下语句:
extension= eaccelerator.so
;eAccelerator
eaccelerator.shm_size= "16"
eaccelerator.cache_dir= "/tmp/eaccelerator"
eaccelerator.enable= "1"
eaccelerator.optimizer= "1"
eaccelerator.check_mtime= "1"
eaccelerator.debug= "0"
eaccelerator.filter= ""
eaccelerator.shm_max= "0"
eaccelerator.shm_ttl= "0"
eaccelerator.prune_period= "0"
eaccelerator.shm_only= "0"
eaccelerator.compress= "1"
eaccelerator.compress_level= "9"
最后,在网关/tmp/目录下创建用于存放eAccelerator缓存文件的目录eaccelerator,并修改该目录权限为777。
4 PHP外部C扩展
使用PHP的外部C扩展将实现与外部库(C库)的交互,另外,可以改善PHP脚本执行效率的问题。通常采用以下3种方式实现C扩展:
l Built-in Modules 编译进PHP
好处: (1)不需要动态加载,模块在php脚本里面可以直接使用.
(2)不需要将模块编译成.so共享库,因为直接编译进PHP。
缺点: (1)对模块的改变都需要重新编译PHP
(2)因为编译进PHP,所以PHP二进制文件较大,而且多占点内存
l External Modules 外部模块,也就是编译成共享库,用dl()函数动态加载。
好处:(1)不需要重新编译 PHP
(2)PHP体积小,因为不需要编译进PHP
缺点:(1)每次*.php脚本执行都需要用 dl()去加载,效率较低
(2)每次都要调用dl()
l The Zend Engine Zend 核心里实现
下面介绍第一种C扩展方式Built-in Modules。
创建C扩展框架
PHP本身提供一个创建扩展框架的工具ext_skel,该工具会生成PHP扩展必须的基本代码,位于PHP源码的ext/目录下。创建一个名为test的扩展库,完成之后,将会生成config.m4、test.c、php_test.h等文件。
cd/home/username/share/php-5.2.17/ext/
./ext_skel--extname=test
修改扩展库
修改config.m4文件,该文件是一个宏解释工具,将输入文件中的宏展开到输出文件,是PHP扩展框架所必须的,用来生成扩展所需的makefile文件。
将源码文件中的如下代码:
dnlPHP_ARG_ENABLE(test, whether to enable test support,
dnl Make sure that the comment is aligned:
dnl [ --enable-test Enabletest support])
替换为(dnl在m4文件中起注释作用,即取消上述代码注释)
PHP_ARG_ENABLE(test, whether to enable testsupport,
Make sure that the comment is aligned:
[ --enable-test Enabletest support])
注意:不要使用PHP_ARG_WITH,可能会出现问题(提示C函数未定义)
修改php_test.h文件,在PHP_FUNCTION(confirm_mysqlc_compiled);语句下追加下述语句:(PHP_FUNCTION是一个Zend Macro,作用是声明一个C函数,使它在PHP脚本中可用,参数是函数的名字)
PHP_FUNCTION(test);
修改test.c文件,该文件为主程序文件,包含了C代码实现。首先,在zend_function_entrytest_functions函数中增加如下语句:
PHP_FE(test,NULL)
在文件最后,增加函数实现:
PHP_FUNCTION(test){
long int a, b;
long int result;
if (zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC, "ll", &a, &b) == FAILURE) {
return;
}
result = hello_add(a, b);
RETURN_LONG(result);
}
test就是在PHP脚本中调用的函数名(不需与扩展库名相同),hello_add函数包含在动态库hello.so(需事先准备好)中,Linux下打包.so文件的GCC命令如下:
arm-linux-gcc-fPIC -O -c -o test.o test.c
arm-linux-gcc-shared -o libtest.so test.o
注意:需将生成的动态库置于交叉编译器的Lib目录下,或者放置于当前目录。zend_parse_parameters的功能是从PHP脚本向该函数传递参数(类似于scanf函数),符号“ll”说明参数的数据类型。
使用buildconf工具重新生成configure文件,实现包含--enable-test参数选项。
注意:由于使用了外部.so动态库,在执行./configure后,需要修改生成的Makefile文件,在EXTRA_LIBS中增加-ltest选项。
编译完成后,将libs/目录下的libphp5.so(使用strip工具瘦身)拷贝到网关WEB服务器配置目录下的lib子目录中。
最后,必须重新启动AppWeb服务器,使PHP内核加载自定义的扩展库。可以编写一个PHP脚本测试是否调用成功。
<?php
echo test(3,9);
?>