php 5.6版本中编写一个PHP扩展的简单示例

 这篇文章主要介绍了php 5.6版本中编写一个PHP扩展的简单示例,本文给出扩展实现代码、编译方法、配置方法和使用例子等内容,需要的朋友可以参考下

 
 

有时候在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, '', 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.

时间: 2024-08-04 14:20:39

php 5.6版本中编写一个PHP扩展的简单示例的相关文章

php 5.6版本中编写一个PHP扩展的简单示例_php技巧

有时候在php本身没有满足需求的api时候,需要自己写相应的扩展,扩展写完之后进行编译,即可加入自己的开发环境中,扩展php的功能. 这里实现一个连接字符串和int型数的连接操作的简单扩展. 首先,下载最新的php源码安装包,进入ext/目录,新建extstrcat.def: 复制代码 代码如下: string extstrcat(string strarg, int intarg) 随后运行: 复制代码 代码如下: ./ext_skel --extname=extstrcat --proto=

list-link中编写一个抽奖程序,如何将comboBox转变成List&amp;amp;lt;T&amp;amp;gt;

问题描述 link中编写一个抽奖程序,如何将comboBox转变成List<T> link中编写一个抽奖程序,如何将comboBox转变成List 解决方案 List<string> items = comboBox1.Items.Cast<String>();

VisuaC++6.0和MFC语言中编写一个像百度网盘的程序

问题描述 VisuaC++6.0和MFC语言中编写一个像百度网盘的程序 VisuaC++6.0和MFC语言中编写一个像百度网盘的程序,要怎么做?用到数据库的知识么?用到哪些? 解决方案 用sql server就是了,微软亲儿子.

JSF中编写一个在页面上显示的Hello World

我们编写一个在页面上显示是"Hello World! ",我们至少需要编写一个Page对象和一个对应模板文件(tml). 第 一步,Page对象编写 在Tapestry5中Page是与一个页面对应的POJO对象,它不需要继承Tapestry框架的任何基类或实现任 何接口,但是随着我们业务变得复杂Page会增加,在它的内部会增加一些事件处理方法和Annotations(标注). 作为第 一个运行的首页面的Page对象命名是有规定的"Start",当然我们还可以设定成为

在liunx中编写一个脚步定期删除mysql中的数据实现步骤_unix linux

首先创建一个文件目录 mkdir myfile vi:创建修改文件 vi delradiusdata 复制代码 代码如下: vi是linux下创建和编辑文件常用的工具,下面已创建startWeblogic.sh脚本为例,讲解常用操作. 1.首先执行vi startWeblogic.sh,如果此时当前目录下没有这个文件,则会进行新建:如果有同名文件,将会读取改文件内容并显示. 2.进入vi编辑器后,初始时是命令模式,如果需要输入文本,可点击键盘上的i,a,r键(i=insert.a=append.

在flex中执行一个javascript方法的简单方式_Flex

例如打开一个新窗口: 复制代码 代码如下: ExternalInterface.call("eval", "myWin = window.open('" + url + "', '" + windowId + "', 'toolbar=1,scrollbars=0,location=1,statusbar=0,menubar=0,resizable=0,width=" + width + ",height="

SharePoint 2010中Silverlight托管客户端模型的简单示例

Silverlight托管客户端模型,是SharePoint2010推出的三种客户端模型".NET托管"."ECMAScript"."Sliverlight"的一种,自己对于Silverlight也不是很熟悉,这也是第一次尝试Sliverlight,不过,我们主要尝试的是客户端模型调用SharePoint,而非Silverlight的功能. 首先,我们打开vs2010新建项目,选择silverlight – Silverlight applica

SharePoint 2010中.Net托管客户端模型的简单示例

.Net托管客户端模型,是SharePoint2010推出的三种客户端模型".NET托管"."ECMAScript"."Sliverlight"的一种,相比Script的客户端对象模型,VS里使用的.Net客户端对象模型感觉使用起来,方便了很多,至少编写的时候会有提示,编译的时候会有错误提示,然后,我们可以把相应的两个dll文件,和编写的程序放到一起,放在客户端执行,感觉还是有收获的. 下面介绍下.Net托管的使用,首先新建一个控制台程序,选择.

xmlHTTP xmlDOC与C#中DataSet的结合实现AJAX简单示例

本例包括1.客户端用xmlHTTP 向服务器页面发送请求2.服务器页面后台用C#中DataSet实现数据库的操作 并得到结果3.客户端用xmlDOC 得到xmlHTTP返回的结果 并对结果进行操作 附录XMLHTTP的常用方法和属性XMLDOC的常用方法和属性 =========================发送xmlHttp请求到服务器端========================= var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP&q