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中$this->含义分析
Nov 29 PHP
PHP下判断网址是否有效的代码
Oct 08 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
Nov 19 PHP
smarty简单入门实例
Nov 28 PHP
Yii2增加验证码步骤详解
Apr 25 PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 PHP
php UNIX时间戳用法详解
Feb 16 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
利用PHP如何统计Nginx日志的User Agent数据
Mar 06 PHP
php测试kafka项目示例
Feb 06 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数学运算
2011/12/30 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
把textarea中字符串里含有的回车换行替换成<br>的javascript代码
2007/04/20 Javascript
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
json简单介绍
2008/06/10 Javascript
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
Js实现动态添加删除Table行示例
2014/04/14 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
vue-amap根据地址回显地图并mark的操作
2020/11/03 Javascript
利用Python学习RabbitMQ消息队列
2015/11/30 Python
python处理Excel xlrd的简单使用
2017/09/12 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
使用python获取电脑的磁盘信息方法
2018/11/01 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
会计岗位职责范本
2014/03/07 职场文书
追悼会主持词
2014/03/20 职场文书
诚信考试标语
2014/06/24 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
2016党员入党决心书
2015/09/22 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书
Pillow图像处理库安装及使用
2022/04/12 Python