APPWeb+PHP5+SQLite3在S3C6410上移植之二

时间:2023-01-02 12:24:02

编译PHP加速器eAccelerator

eAccelerator是一款开源PHP加速器,优化动态内容缓存,提高php脚本的缓存性能,使PHP脚本在编译的状态下,对服务器的开销几乎完全消除;另外,可以实现脚本优化,加快脚本执行速率,最终使PHP程序代码执行效率提高110倍。

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

执行成功后,系统提示信息如下:

APPWeb+PHP5+SQLite3在S3C6410上移植之二

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时将出现如下错误:

APPWeb+PHP5+SQLite3在S3C6410上移植之二

该错误可通过下述方法进行修改:

修改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

cdtest

修改扩展库

修改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”说明参数的数据类型。

重新编译PHP

使用buildconf工具重新生成configure文件,实现包含--enable-test参数选项。

注意:由于使用了外部.so动态库,在执行./configure后,需要修改生成的Makefile文件,在EXTRA_LIBS中增加-ltest选项。

编译完成后,将libs/目录下的libphp5.so(使用strip工具瘦身)拷贝到网关WEB服务器配置目录下的lib子目录中。

最后,必须重新启动AppWeb服务器,使PHP内核加载自定义的扩展库。可以编写一个PHP脚本测试是否调用成功。

<?php

   echo test(3,9);

?>