php的扩展写法总结

yipeiwu_com6年前PHP代码库

为什么要用C扩展

C是静态编译的,执行效率比PHP代码高很多。同样的运算代码,使用C来开发,性能会比PHP要提升数百倍。IO操作如CURL,因为耗时主要在IOWait上,C扩展没有明显优势。

另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据,C扩展可操作的范围更广。

第一步

下载PHP的源代码,如php-5.4.16。解压后进入php-5.4.16\ext目录。输入 ./ext_skel –extname=myext,myext就是扩展的名称,执行后生成myext目录。

ext_skel是PHP官方提供的用于生成php扩展骨架代码的工具。

cd myext。可以看到php_myext.h、myext.c、config.m4等几个文件。config.m4是AutoConf工具的配置文件,用来修改各种编译选项。

第二步

修改config.m4,将

dnl PHP_ARG_WITH(myext, for myext support,

dnl Make sure that the comment is aligned:

dnl [ --with-myext       Include myext support])

修改为

PHP_ARG_WITH(myext, for myext support,

[ --with-myext       Include myext support])

下边还有一个 –enable-myext,是表示编译到php内核中。with是作为动态链接库载入的。

第三步

修改php_myext.h,看到PHP_FUNCTION(confirm_myext_compiled); 这里就是扩展函数声明部分,可以增加一行 PHP_FUNCTION(myext_helloworld); 表示声明了一个myext_helloworld的扩展函数。

然后修改myext.c,这个是扩展函数的实现部分。

const zend_function_entry myext_functions[] = {

    PHP_FE(confirm_myext_compiled, NULL)      /* For testing, remove later. */

    PHP_FE(myext_helloworld, NULL)

    PHP_FE_END   /* Must be the last line in myext_functions[] */

};

这的代码是将函数指针注册到Zend引擎,增加一行PHP_FE(myext_helloworld, NULL)(后面不要带分号)。

第四步

在myext.c末尾加myext_helloworld的执行代码。

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目录下依次执行phpize、./configure 、make、make install。然后修改php.ini加入extension=myext.so

执行php -r “myext_helloworld(‘test');”,输出hello world!

相关文章

PHP函数strip_tags的一个bug浅析

PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。 由于 s...

php Imagick获取图片RGB颜色值

很多图片站点都会根据用户上传的图片检索出图片的主要颜色值,然后在通过颜色搜索相关的图片。 之前按照网上的方法将图片缩放(或者马赛克)然后遍历每个像素点,然后统计处RGB次数最多的值,这做...

php use和include区别总结

PHP中use、include的区别 1、include是导入文件,如果找不到文件,include会报warning,继续执行。 2、use是使用命名空间,相当于java中的导包,前提是...

PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)

废话不多少,上代码复制代码 代码如下: // 获取指定日期所在星期的开始时间与结束时间 function getWeekRange($date){ &nbs...

php项目打包方法第1/2页

企业网站好说,至少需要个虚拟主机什么的;可是OA,财务……这些内部系统就不好说了,总不能把代码和数据库扔给人家,写个说明,让他们自己照着说明去配置环境,安装代码吧。这样显然不像话,要知道...