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 相关文章推荐
PHP的分页功能
Mar 21 PHP
php curl post 时出现的问题解决
Jan 30 PHP
php function用法如何递归及return和echo区别
Mar 07 PHP
教你如何解密 “ PHP 神盾解密工具 ”
Jun 20 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
PHP异常处理浅析
May 12 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
php实现无限级分类查询(递归、非递归)
Mar 10 PHP
yii2利用自带UploadedFile实现上传图片的示例
Feb 16 PHP
总结一些PHP中好用但又容易忽略的小知识
Jun 02 PHP
PHP7 mongoDB扩展使用的方法分享
May 02 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 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的5个入手程序
2006/11/23 PHP
详解:――如何将图片储存在数据库里
2006/12/05 PHP
PHP 防注入函数(格式化数据)
2011/08/08 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
javascript读取RSS数据
2007/01/20 Javascript
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
2016/12/21 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
js实现碰撞检测
2021/01/29 Javascript
python爬虫线程池案例详解(梨视频短视频爬取)
2021/02/20 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
食堂个人先进事迹
2014/01/22 职场文书
专业见习报告范文
2014/11/03 职场文书
2014年艾滋病防治工作总结
2014/12/10 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
公司财务管理制度
2015/08/04 职场文书
爱护公物主题班会
2015/08/17 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书
大学生创业计划书
2019/06/24 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
Pandas自定义选项option设置
2021/07/25 Python
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏