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创建基本身份认证站点的方法详解
Jun 08 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
php+mysql实现用户注册登陆的方法
Jan 03 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
Feb 23 PHP
PHP中文字符串截断无乱码解决方法
Oct 10 PHP
PHP提取字符串中的手机号正则表达式怎么写
Jul 17 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
Sep 10 PHP
laravel5表单唯一验证的实例代码
Sep 30 PHP
PHP类的自动加载与命名空间用法实例分析
Jun 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
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
JS实现双击内容变为可编辑状态
2017/03/03 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
关于Vue.nextTick()的正确使用方法浅析
2017/08/25 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
自定义Vue组件打包、发布到npm及使用教程
2019/05/22 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
Python多层装饰器用法实例分析
2018/02/09 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
如何用python整理附件
2018/05/13 Python
实用自动化运维Python脚本分享
2018/06/04 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
Python3内置模块random随机方法小结
2019/07/13 Python
python+pygame实现坦克大战
2019/09/10 Python
python判断两个序列的成员是否一样的实例代码
2020/03/01 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
公务员年度考核个人总结
2015/02/12 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
2016预备党员培训心得体会
2016/01/08 职场文书
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android