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
header()函数使用说明
Nov 23 PHP
dede全站URL静态化改造[070414更正]
Apr 17 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
smarty内置函数section的用法
Jan 22 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
Jun 15 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
PHP用PDO如何封装简单易用的DB类详解
Jul 30 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
PHP实现用户登录的案例代码
May 10 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
May 24 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 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
PHP中数组的分组排序实例
2014/06/01 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
2014/12/04 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
一个可以显示阴历的JS代码
2007/03/05 Javascript
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
vue2.0全局组件之pdf详解
2017/06/26 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
JS随机密码生成算法
2019/09/23 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python多线程http下载实现示例
2013/12/30 Python
在Django框架中设置语言偏好的教程
2015/07/27 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
使用Python构造hive insert语句说明
2020/06/06 Python
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
法律专业个人实习自我鉴定
2013/09/23 职场文书
环保倡议书100字
2014/05/15 职场文书
扬尘污染防治方案
2014/06/15 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
离婚案件上诉状
2015/05/23 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
python中redis包操作数据库的教程
2022/04/19 Python
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript