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 相关文章推荐
模仿OSO的论坛(三)
Oct 09 PHP
php中的登陆login
Jan 18 PHP
用mysql内存表来代替php session的类
Feb 01 PHP
Zend Studio (eclipse)使用速度优化方法
Mar 23 PHP
php实现利用phpexcel导出数据
Aug 24 PHP
PHP判断上传文件类型的解决办法
Oct 20 PHP
通过PHP简单实例介绍文件上传
Dec 16 PHP
php生成二维码图片方法汇总
Dec 17 PHP
Yii框架实现的验证码、登录及退出功能示例
May 20 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
php生成二维码不保存服务器还有下载功能的实现代码
Aug 09 PHP
php array 转json及java 转换 json数据格式操作示例
Nov 13 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
php实例分享之html转为rtf格式
2014/06/02 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
JS 控制非法字符的输入代码
2009/12/04 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
2017/01/20 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
微信小程序的分类页面制作
2017/06/27 Javascript
基于ES6作用域和解构赋值详解
2017/11/03 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
Python  连接字符串(join %)
2008/09/06 Python
Python 检查数组元素是否存在类似PHP isset()方法
2014/10/14 Python
python开发之list操作实例分析
2016/02/22 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
NumPy排序的实现
2020/01/21 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
纽约家具、家居装饰和地毯店:ABC Carpet & Home
2017/06/21 全球购物
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
优秀本科生求职推荐信
2014/02/24 职场文书
企业授权委托书范本
2014/04/02 职场文书
会计演讲稿范文
2014/05/23 职场文书
自查自纠整改报告
2014/11/06 职场文书
2015年教学工作总结
2015/04/02 职场文书
课程设计感想范文
2015/08/11 职场文书
体育部部长竞选稿
2015/11/21 职场文书
党员心得体会范文2016
2016/01/23 职场文书