php的扩展写法总结


Posted in PHP onMay 14, 2019

为什么要用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 相关文章推荐
PHP服务器页面间跳转实现方法
Aug 02 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
Dec 29 PHP
初识PHP
Sep 28 PHP
php用户注册时常用的检验函数实例总结
Dec 22 PHP
PHP使用适合阅读的格式显示文件大小的方法
Mar 05 PHP
10条php编程小技巧
Jul 07 PHP
PHP实现linux命令tail -f
Feb 22 PHP
Yii2使用swiftmailer发送邮件的方法
May 03 PHP
PHP使用ActiveMQ实例
Feb 05 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
laravel框架如何设置公共头和公共尾
Oct 22 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
May 13 #PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 #PHP
ThinkPHP3.2框架自带分页功能实现方法示例
May 13 #PHP
PHP使用Redis实现Session共享的实现示例
May 12 #PHP
如何让PHP编码更加好看利于阅读
May 12 #PHP
Yii2处理密码加密及验证的方法
May 12 #PHP
php和asp语法上的区别总结
May 12 #PHP
You might like
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
php文件读取方法实例分析
2015/06/20 PHP
php基于openssl的rsa加密解密示例
2016/07/11 PHP
刷新时清空文本框内容的js代码
2007/04/23 Javascript
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
Python端口扫描简单程序
2016/11/10 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
python3利用tcp实现文件夹远程传输
2018/07/28 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
简单了解python元组tuple相关原理
2019/12/02 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
自我鉴定总结
2014/03/24 职场文书
小学亲子活动总结
2014/07/01 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
检讨书范文大全
2015/05/07 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python