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 19 PHP
PHP执行zip与rar解压缩方法实现代码
Dec 05 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
May 29 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
理解php依赖注入和控制反转
May 11 PHP
php使用Jpgraph创建3D饼形图效果示例
Feb 15 PHP
php输出图像的方法实例分析
Feb 16 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
Mar 02 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
php 的多进程操作实践案例分析
Feb 28 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 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+javascript模拟Matrix画面
2006/10/09 PHP
php中的观察者模式
2010/03/24 PHP
PHP 检查扩展库或函数是否可用的代码
2010/04/06 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
获取PHP警告错误信息的解决方法
2013/06/03 PHP
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
2013/10/22 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
用Python生成器实现微线程编程的教程
2015/04/13 Python
简单了解django文件下载方式
2020/02/10 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
Django数据统计功能count()的使用
2020/11/30 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
请假条的格式
2014/04/11 职场文书
食品安全标语
2014/06/07 职场文书
厕所文明标语
2014/06/11 职场文书
大学专科求职信
2014/07/02 职场文书
销售人才自我评价范文
2014/09/27 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
离职感谢信怎么写
2015/01/22 职场文书
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers