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 相关文章推荐
ADODB类使用
Nov 25 PHP
使用apache模块rewrite_module (转)
Feb 14 PHP
php字符串截取中文截取2,单字节截取模式
Dec 10 PHP
PHP模块 Memcached功能多于Memcache
Jun 14 PHP
php新建文件自动编号的思路与实现
Jun 27 PHP
PHP关联链接常用代码
Nov 05 PHP
PHP数组传递是值传递而非引用传递概念纠正
Jan 31 PHP
php curl基本操作详解
Jul 23 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
php数据库备份还原类分享
Mar 20 PHP
详谈PHP编码转换问题
Jul 28 PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 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)
2010/09/04 PHP
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
php header函数的常用http头设置
2015/06/25 PHP
详解js异步文件加载器
2016/01/24 PHP
node.js中的fs.futimesSync方法使用说明
2014/12/17 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
2017/04/13 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
node.js如何根据URL返回指定的图片详解
2020/10/21 Javascript
使用Python获取Linux系统的各种信息
2014/07/10 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
函授毕业自我鉴定
2014/02/04 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
医生见习报告范文
2014/11/03 职场文书
出纳岗位职责
2015/01/31 职场文书
美术教师个人工作总结
2015/02/06 职场文书
教师师德承诺书2016
2016/03/25 职场文书
Python标准库之typing的用法(类型标注)
2021/06/02 Python