最近在公司做的事情就是php扩展开发,虽然我只负责c++代码的编写,但是了解扩展开发的流程还是很有必要的。
(本文介绍的是动态扩展,对静态扩展有兴趣的读者可自行google)
php扩展开发环境搭建可参考:
CentOS安装配置nginx和php
假设我们需要增加一个函数echodemo_string,对应的php代码如下:
function echodemo_string($param) { $result = "your input is $param"; return $result; }
1. 创建扩展框架
这里要用到一个工具:ext_skel,它位于php源码目录的ext目录下。
假设扩展的名字为echodemo。
首先进入ext目录,
创建文件echodemo.skel,编辑文件内容
string echodemo_string(string param)
然后执行:
./ext_skel --extname=echodemo --proto=echodemo.skel
执行完毕会生成 echodemo 目录,目录包含如下内容:
2. 修改配置
打开config.m4,将第10、11、12行前面的dnl去掉,dnl表示注释。
3. 实现功能
打开echodemo.c,echodemo_string函数定义如下:
修改该函数实现我们需要的功能,最终实现如下:
(vim主题太丑了,我得换换。。。)
4. 编译安装扩展
这里需要用到phpize生成configure文件,在我的机器上,phpize位于/usr/local/php/bin目录。
phpize ./configure --with-php-config=/usr/local/php/bin/php-config make make install
当出现 "Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/",表示新的扩展 echodemo.so 已经安装完成。
此时还需要做的一件事就是修改 php.ini 文件。
不知道 php.ini 文件在哪?直接 php -i | grep php.ini 。我的在 /usr/local/php/lib 目录下。
文件末尾追加一行:
extension=echodemo.so
5. 验证安装
重启php-fpm:service php-fpm restart,
检查扩展是否加载:
php -m | grep echodemo
如果顺利,终端会输出 echodemo。
检查扩展代码是否正确:
php -r "echo echodemo_string('hello world');"
注意,我外部用的双引号,函数参数用的单引号,这是为了避免一些转义错误。
参考资料:
PHP扩展开发:第一个扩展
Linux 下PHP扩展开发系列:二. 一个典型的扩展开发
最后配张图: