用C扩展PHP.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用C扩展PHP1、新建 新建一个名称为“hello”的扩展 cd?php-5.2.10/ext ?? ./ext_skel?--extname=hello?? cd php-5.2.10/ext ./ext_skel --extname=hello 执行该命令后,ext_skel脚本会创建一个“hello”的目录,目录结构如下: 2、修改 接下来打开文件config.m4,找到这3行代码, 修改为如下: ? 其实是将第1、3行的注解去掉(该文件中,“dnl”开头的均表示被注解状态),去掉后可以在编译php的时候通过加入–enable-hello参数将hello模块编译进去,不过在本例中,hello模块将被独立被编译成so模块,因为重新编译一次php是比较消耗时间的,而且不至于hello模块每做任何改动,都要重新编译一次php,何况在生产环境上是不允许频繁这么做的,当然在这里,我考虑更多的是照顾下低配置vps了 3、编译 现在,我们可以开始编译的工作了,在这里我将该扩展编译为一个独立的hello.so模块(就相当于windows下的dll扩展),在php代码中通过dl(”hello.sdo”)命令调用该模块,当然也可以通过在php.ini中通过extension = “memcache.so”将其加载进来,不过得重新启动一下php,或者fpm了 /usr/local/webserver/php/bin/phpize ?? ./configure?--with-php-config=/usr/local/webserver/php/bin/php-config ?? make??make?install?? /usr/local/webserver/php/bin/phpize ./configure --with-php-config=/usr/local/webserver/php/bin/php-config make make install 编译完之后,将生成hello.so模块: 4、测试 ?php ?? dl(hello.so); ?? echo?confirm_hello_compiled(); ?? //输出:Congratulations!?You?have?successfully?modified?ext/hello/config.m4.?Module?is?now?compiled?into?PHP. ?? ??? ?php dl(hello.so); echo confirm_hello_compiled(); //输出:Congratulations! You have successfully modified ext/hello/config.m4. Module is now compiled into PHP. ? 到现在为止,我们已经迈出第一步,一个hello.so扩展已经完成了,只是该扩展还没有完成任何功能,仅仅是调用了一个confirm_hello_compiled函数,并且该函数输出了简单的信息,接下来,我们继续了解c如何扩展php … 在编译过程中,可能出现无法加载现象,可能是enable_dl = On选项设置的问题,请仔细检查php.ini文件中对应enable_dl是否真的为On ? ? 附加 需要给函数传递参数示例如下: 修改主程序hello.c中 ? PHP_FUNCTION(confirm_hello_compiled) { ?char *arg = NULL; ?int arg_len, len; ?char string[256]; ?char *arg1 = NULL; ?int arg_len1; ?char *arg2 = NULL; ?int arg_len2; ?if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, sss,arg, arg_len ,arg1, arg_len1 ,arg2, arg_len2) == FAILURE) { ??return; ?} ?len = sprintf(string, first arg=== %.78s \tsecond arg===%.78s\tthird arg=== %.78s \n,arg,arg1,arg2); ?RETURN_STRINGL(string, len, 1); } ? 重新编译 make make install ? 然后再调用 ?php dl(hello.so); echo confirm_hello_compiled(aaa,bbbb,ccc); ?

文档评论(0)

df829393 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档