php 5.6版本中编写一个PHP扩展的简单示例


Posted in PHP onJanuary 20, 2015

有时候在php本身没有满足需求的api时候,需要自己写相应的扩展,扩展写完之后进行编译,即可加入自己的开发环境中,扩展php的功能。

这里实现一个连接字符串和int型数的连接操作的简单扩展。

首先,下载最新的php源码安装包,进入ext/目录,新建extstrcat.def:

string extstrcat(string strarg, int intarg)

随后运行:
./ext_skel --extname=extstrcat --proto=extstrcat.def

修改ext/extstrcat/config.m4,去掉如下行前面的注释(dnl):
PHP_ARG_ENABLE(extstrcat, whether to enable extstrcat support,  

Make sure that the comment is aligned:  

[  --enable-extstrcat           Enable extstrcat support])

此时来编辑ext/extstrcat/extstrcat.c,找到PHP_FUNCTION(extstrcat)函数,这里表示扩展中的方法名为extstrcat,方法实现如下:

PHP_FUNCTION(extstrcat)

{

     char *strarg = NULL;

     int argc = ZEND_NUM_ARGS();

     int strarg_len;

     long intarg;

 

     char intargstr[10];

     int retstrlen = 0;

     char *retstr = NULL;

 

     if (zend_parse_parameters(argc TSRMLS_CC, "sl", &strarg, &strarg_len, &intarg) == FAILURE)

         return;

 

     snprintf(intargstr, 9, "%d", intarg);

     retstrlen = strarg_len + strlen(intargstr) + 1;

     retstr = (char *)malloc(sizeof(char)* retstrlen);

     memset(retstr, '\0', retstrlen);

     strncat(retstr, strarg, strlen(strarg));

     strncat(retstr, intargstr, strlen(intargstr));

     RETURN_STRING(retstr, 1);

 

     php_error(E_WARNING, "extstract: not yet implemented");

}

,其中strarg和intarg即为对应的两个字符串和整型参数。
接下来要做的事情就是编译扩展,

phpize

./configure --enable-extstrcat

make

编译成功之后,在ext/modules目录下会生成extstrcat.so文件,
cp ./modules/extstrcat.so /usr/local/lib/php/extensions/no-debug-non-zts-20121212/

修改php.ini,增加extension = extstrcat.so。
重启php-fpm,运行phpinfo()可以看到新增了extstrcat扩展。
现在来写一个Demo,测试一下刚刚的php扩展,

<?php

if(!extension_loaded('extstrcat')) {

 dl('extstrcat.' . PHP_SHLIB_SUFFIX);

}

$ret=extstrcat('testarg',1234);

echo $ret;

?>

,命令行下运行该文件,得到testarg1234.
PHP 相关文章推荐
给多个地址发邮件的类
Oct 09 PHP
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
Aug 19 PHP
php magic_quotes_gpc的一点认识与分析
Aug 18 PHP
PHP中的cookie不用刷新就生效的方法
Feb 04 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
May 03 PHP
解析php中获取系统信息的方法
Jun 25 PHP
php通过ksort()函数给关联数组按照键排序的方法
Mar 18 PHP
php身份证号码检查类实例
Jun 18 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
php处理抢购类功能的高并发请求
Feb 08 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
May 05 PHP
PHP函数extension_loaded()用法实例
Jan 19 #PHP
php使用正则表达式获取图片url的方法
Jan 16 #PHP
php使用CURL伪造IP和来源实例详解
Jan 15 #PHP
php+mysql实现无限分类实例详解
Jan 15 #PHP
php截取html字符串及自动补全html标签的方法
Jan 15 #PHP
php在linux下检测mysql同步状态的方法
Jan 15 #PHP
php中静态类与静态变量用法的区别分析
Jan 15 #PHP
You might like
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
php返回字符串中所有单词的方法
2015/03/09 PHP
PHP的全局错误处理详解
2016/04/25 PHP
php Session无效分析资料整理
2016/11/29 PHP
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
比Jquery的document.ready更快的方法
2010/04/28 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
解决vue-cli创建项目的loader问题
2018/03/13 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
python3编写C/S网络程序实例教程
2014/08/25 Python
收集的几个Python小技巧分享
2014/11/22 Python
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
tornado+celery的简单使用详解
2019/12/21 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
python字典按照value排序方法
2020/12/28 Python
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
会计电算化应届生求职信
2013/11/03 职场文书
大专生简历的自我评价
2013/11/26 职场文书
优秀求职自荐信怎样写
2013/12/18 职场文书
安全检查验收制度
2014/01/12 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
机关职员工作检讨书
2014/10/23 职场文书
北京颐和园导游词
2015/01/30 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
七个非常实用的Python工具包总结
2021/06/15 Python
MySQL transaction事务安全示例讲解
2022/06/21 MySQL