mydeer
就像我们从来没有来过这里,但这种感觉似曾相识。
如何编写 PHP 扩展 之 我的第一个PHP扩展

这里介绍使用C 做php 的扩展,首先得有PHP安装的源码,其次以下几步:

  • 编写skel 原型
  • 生成PHP扩展框架
  • 编写自己的代码逻辑
  • 编译成PHP扩展 *.so
  • 拷贝到PHP扩展目录,重启PHP服务
  • 调用自己的PHP扩展

其实在PHP源码里面已经说明了如何编写扩展:

 vim ./php-5.6.7/README.EXT_SKEL

上面的几步除了1 ,3之外都不需要思考就能做的事,那么我们来实现一个简单的  a + b的扩展helloc函数,最终达到的目的:

<?php helloc(1022);?> // 输出为 32;

背景介绍完,现在开始:

编写skel 原型

到php安装目录下,创建文件 helloc.skel,并填写内容:

# cd  ./php-5.6.7/ext/
# vim  helloc.skel
int helloc(int a int b)

生成PHP 扩展框架

在当前 ./php-5.6.7/ext/ 下执行:

# ./ext_skel --extname=helloc --proto=helloc.skel 

会生成一个 helloc 的文件夹

编写自己的代码逻辑

进入helloc ,修改config.m4文件:

# cd helloc
# vim config.m4

将如下三行的 dnl 删除:

dnl PHP_ARG_WITH(helloc for helloc support
dnl Make sure that the comment is aligned:
dnl [  --with-helloc             Include helloc support])

修改后为:

PHP_ARG_WITH(helloc for helloc support
Make sure that the comment is aligned:
[  --with-helloc             Include helloc support])

进行我们的重点,编写 a+b的逻辑。进入helloc.c

# vim helloc.c

找到如下函数,PHP_FUNCTION(helloc),并修改为如下:

PHP_FUNCTION(helloc)
{
    int argc = ZEND_NUM_ARGS();
    long a;
    long b;
    long re;   // 新增的

    if (zend_parse_parameters(argc TSRMLS_CC "ll" &a &b) == FAILURE)
        return;

    re = a+b;    // 新增的
    RETURN_LONG(re);   // 新增的
}

好了,我们的逻辑写完了。

编译成PHP扩展 *.so

只剩下编译的活了

# /usr/bin/phpize 
# ./configure --with-php-config=/usr/bin/php-config
# make

拷贝到PHP扩展目录,重启PHP服务

# cp modules/helloc.so /usr/lib64/php/modules/
# vim /etc/php.ini           // 为php配置文件加上扩展(文件末尾就行)
extension=helloc.so

# service php-fpm restart    // 这里你用的apache那么就需要重启 apache

调用自己的PHP扩展

最后写个test.php验证自己的扩展:

# vim test.php
<?php echo helloc(1022); ?>

# php test.php

结果:

test.png


OK,这就是你的第一个PHP扩展,完结。

<< 上一篇 PHP变量的结构和类型 PHP <<< 定界符 下一篇 >>
文章标签
随意 | Created At 2014 By William Clinton | 蜀ICP备14002619号-4 |