笔记随笔-生活工作点滴

如何编写PHP拓展

2019-07-08  本文已影响6人  vins
为什么要用C扩展

C是静态编译的,执行效率比PHP代码高很多。同样的运算代码,使用C来开发,性能会比PHP要提升数百倍。IO操作如CURL,因为耗时主要在IOWait上,C扩展没有明显优势。
另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据,C扩展可操作的范围更广。

准备工作:
  1. lnmp环境
  2. 对应的php版本源码(https://www.php.net/downloads.php)
第一步

在/usr/local/ 下面建立一个空白目录 PhpSourceCode 存放php源码


第二步

进入源码目录 cd /usr/local/PhpSourceCode/php-5.6.40/ext/
执行命令:./ext_skel --extname=myext 出现下面则表示成功
cd myext 可以看到php_myext.h、myext.c、config.m4等几个文件。config.m4是AutoConf工具的配置文件,用来修改各种编译选项。

image.png
第三步:修改config.m4
image.png

修改为:


image.png
第四步:

修改php_myext.h文件: 添加以下两行代码 (del 为注释)

  1. PHP_FUNCTION(confirm_myext_compiled);
  2. PHP_FUNCTION(myext_helloworld);


    image.png
第五步

修改myext.c文件 这的代码是将函数指针注册到Zend引擎,


image.png

在myext.c 末尾加上

PHP_FUNCTION(myext_helloworld)
{
    char *arg = NULL;
    int arg_len, len;
    char *strg;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
        return;
    }
    php_printf("Hello World!\n");
    //RETRUN_TRUE;
}
zend_parse_parameters是用来接受PHP传入的参数,RETURN_XXX是用来返回给PHP数据。
第六步:开始编译啦 在myext目录下依次执行:
  1. /usr/local/php/bin/phpize
  2. ./configure --with-php-config=/usr/local/php/bin/php-config
  3. make
  4. make test
  5. 然后修改php.ini加入extension=myext.so 重启服务应用
image.png

ok 完成编写....

上一篇下一篇

猜你喜欢

热点阅读