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, '\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.

(0)

相关推荐

  • PHP5.3以上版本安装ZendOptimizer扩展

    现在很多PHP程序都需要ZendOptimizer环境,但是ZendOptimizer在PHP5.2之后已经被支持,那怎么办,Zend也不会这么做,原来PHP5.3开始ZendOptimizer正式改为Zend Guard Loader. Zend Guard Loader的发布,而且Zend Optimizer不会再更新,并且由于差异很大使用Zend Guard加密代码时将提示你是否使用php5.3,如果使用5.3那么代码就无法在php5.2上运行. Zend Guard Loader安装说明

  • 如何把php5.3版本升级到php5.4或者php5.5

    今天我们这篇php的技术文章主要为各位朋友们介绍如何使用yum进行安装php的5.4或者5.5版本.当然我们使用centos6.5作为我们的测试机器.其实非常简单,只要下面的两个命令就可以轻松的进行安装php的5.4版本了. 复制代码 代码如下: yum remove php php-bcmath php-cli php-common php-devel php-fpm  php-gd php-imap php-ldap php-mbstring php-mcrypt php-mysql  ph

  • php5.3以后的版本连接sqlserver2000的方法

    最近在做一个系统要抓取管家数据库里面的几个表的数据显示在web页面,于是乎上网搜了一下php如何连接sqlserver2000数据库,网上很多教材都是要配置php.ini配置文件,去掉;extension=php_mssql.dll前面的分号";",然后把ext文件里面php_mssql.dll复制粘贴到系统盘system32目录下,然后重启apache服务器即可,然后写连接数据库的代码件:<?php $conn=mssql_connect("服务器",&qu

  • PHP7.0版本备注

    PHP7.0新版本不仅在性能方面大大提升而且在语言特性方面也改变很多,具体讲解请看下文: 1. 向后不兼容的变化 语言变化 变量处理的变化 间接变量.属性和方法引用现在以从左到右的语义进行解释.一些例子: $$foo['bar']['baz'] // 解释做 ($$foo)['bar']['baz'] $foo->$bar['baz'] // 解释做 ($foo->$bar)['baz'] $foo->$bar['baz']() // 解释做 ($foo->$bar)['baz']

  • php5.4以下版本json不支持不转义内容中文的解决方法

    本文实例讲述了php5.4以下版本json不支持不转义内容中文的解决方法.分享给大家供大家参考.具体分析如下: 写ERP接口的时候遇到JAVA方接收这种json_encode后的内容 复制代码 代码如下: {"orderCode":"1401160935542399","creator":"\u751f\u6d3b\u7528\u54c1\u6d4b\u8bd5\u5c0f\u5c4b"} 其中"creator&qu

  • PHP5各个版本的新功能和新特性总结

    本文目录:PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束PHP5.2:JSON 支持PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredoc 和 Nowdoc, const, 三元运算符,PharPHP5.4:Short Open Tag, 数组简写形式,Traits, 内置 Web 服务器,细节修改PHP5.5:yield, list() 用于 foreach, 细节修改PHP5.6: 常量增强,可变函数参数,命名空间增强 一.PH

  • php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总

    从旧版升级到php5.4,恐怕最麻烦的就是htmlspecialchars这个问题了!当然,htmlentities也会受影响,不过,对于中文站来说一般用htmlspecialchars比较常见,htmlentities非常少用到. 可能老外认为网页普遍应该是utf-8编码的,于是苦了那些用GB2312,GBK编码的中文站......! 具体表现: 复制代码 代码如下: $str = "9enjoy.com的php版本是5.2.10"; echo htmlspecialchars($s

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

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

  • 基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算

    方法一: 结合lambda表达式.函数调用运算符.标准库函数对象.C++11标准新增的标准库function类型,编写一个简单的计算器,可实现简单的加.减.乘.除.取余二元运算.代码如下: #include "pch.h" #include <iostream> #include <functional> #include <map> #include <string> using namespace std; int add(int i

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

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

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

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

  • Java及Android中常用链式调用写法简单示例

    本文实例讲述了Java及Android中常用链式调用写法.分享给大家供大家参考,具体如下: 最近发现,目前大火的许多开源框架中,大多都使用了一种"(方法).(方法).(方法)"的形式进行调用,最典型的就是RxJava.android中AlertDialog控件的源码也是这种形式的.查阅可知,大家把它叫做链式调用."行动是检验程序的唯一标准"0.0!查了.说了那么多,还是得自己写个例子并运行出预期的效果. /** * * 链式调用 * * @author k.k *

  • 用JS编写一个函数,返回数组中重复出现过的元素(实例)

    用JS编写一个函数,返回数组中重复出现过的元素,见下面的代码: var arr = [1, 2, 3, 1, 2, 3, 4, 5]; var getRepeat = function (arr) { var obj = {}; for (var i = 0, len = arr.length; i < len; i++) { if (obj[arr[i]] == undefined) { obj[arr[i]] = 1; } else { obj[arr[i]]++; } } for (var

  • Bootstrap编写一个同时适用于PC、平板、手机的登陆页面

    Bootstrap如同前台框架,它已经布置好不少的CSS,前端开发的使用需要则直接调用即可.其网站的网址就是http://www.bootcss.com.使用Bootstrap能减少前端开发时候在CSS样子的布置时间 需要使用Bootstrap先在官网(点击打开链接)下载组件即可,用于生产环境的Bootstrap版本(点击打开链接),Bootstrap3对2并不兼容,建议直接根据其开发文档使用Bootstrap3. 将Bootstrap解压之后把得到的3个文件夹css,fonts,js拷贝到站点

  • 用Python编写一个简单的Lisp解释器的教程

    本文有两个目的: 一是讲述实现计算机语言解释器的通用方法,另外一点,着重展示如何使用Python来实现Lisp方言Scheme的一个子集.我将我的解释器称之为Lispy (lis.py).几年前,我介绍过如何使用Java编写一个Scheme解释器,同时我还使用Common Lisp语言编写过一个版本.这一次,我的目的是尽可能简单明了地演示一下Alan Kay所说的"软件的麦克斯韦方程组" (Maxwell's Equations of Software). Lispy支持的Scheme

  • 在Django中编写模版节点及注册标签的方法

    编写模板节点 编写自定义标签的第二步就是定义一个拥有 render() 方法的 Node 子类. 继续前面的例子,我们需要定义 CurrentTimeNode : import datetime class CurrentTimeNode(template.Node): def __init__(self, format_string): self.format_string = str(format_string) def render(self, context): now = dateti

  • 如何编写一个ASP类

    前几天大佛写了"ASP设计模式",可能有些初学者或者刚刚接触ASP的朋友不一定完全看得明白,偶就整理了一下编写一个ASP类的方法,大部分是从网上找来的.希望对朋友们有帮助.  <ASP设计模式>(作者 我佛山人): dispbbs.asp?boardID=20&ID=247879 首先ASP的类是由事件和方法(它们就是构成类的成员了)构成的,如果大家还没有接触过,可以先看看下面的说明: 在 Class 块中,成员通过相应的声明语句被声明为 Private(私有成员,

随机推荐