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
一个ubbcode的函数,速度很快.
Oct 09 PHP
实用函数9
Nov 08 PHP
PHP 反射机制实现动态代理的代码
Oct 22 PHP
PHP合并数组+与array_merge的区别分析
Aug 01 PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 PHP
解析PHP实现下载文件的两种方法
Jul 05 PHP
php多任务程序实例解析
Jul 19 PHP
php获取QQ头像并显示的方法
Dec 23 PHP
thinkPHP内置字符串截取函数用法详解
Nov 15 PHP
PHPExcel导出2003和2007的excel文档功能示例
Jan 04 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
MVC模式的PHP实现
2006/10/09 PHP
通达OA公共代码 php常用检测函数
2011/12/14 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python探索之URL Dispatcher实例详解
2017/10/28 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
Python数据库小程序源代码
2019/09/15 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
英文简历中的自我评价
2013/10/06 职场文书
中文专业毕业生自荐信
2013/10/28 职场文书
书法比赛获奖感言
2014/02/10 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
鸿蒙3.0体验感怎么样? 鸿蒙3.0系统评测向
2022/08/14 数码科技