php的扩展写法总结

为什么要用C扩展

C是静态编译的,执行效率比PHP代码高很多。同样的运算代码,使用C来开发,性能会比PHP要提升数百倍。IO操作如CURL,因为耗时主要在IOWait上,C扩展没有明显优势。

另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据,C扩展可操作的范围更广。

第一步

下载PHP的源代码,如php-5.4.16。解压后进入php-5.4.16\ext目录。输入 ./ext_skel –extname=myext,myext就是扩展的名称,执行后生成myext目录。

ext_skel是PHP官方提供的用于生成php扩展骨架代码的工具。

cd myext。可以看到php_myext.h、myext.c、config.m4等几个文件。config.m4是AutoConf工具的配置文件,用来修改各种编译选项。

第二步

修改config.m4,将

dnl PHP_ARG_WITH(myext, for myext support,

dnl Make sure that the comment is aligned:

dnl [ --with-myext       Include myext support])

修改为

PHP_ARG_WITH(myext, for myext support,

[ --with-myext       Include myext support])

下边还有一个 –enable-myext,是表示编译到php内核中。with是作为动态链接库载入的。

第三步

修改php_myext.h,看到PHP_FUNCTION(confirm_myext_compiled); 这里就是扩展函数声明部分,可以增加一行 PHP_FUNCTION(myext_helloworld); 表示声明了一个myext_helloworld的扩展函数。

然后修改myext.c,这个是扩展函数的实现部分。

const zend_function_entry myext_functions[] = {

    PHP_FE(confirm_myext_compiled, NULL)      /* For testing, remove later. */

    PHP_FE(myext_helloworld, NULL)

    PHP_FE_END   /* Must be the last line in myext_functions[] */

};

这的代码是将函数指针注册到Zend引擎,增加一行PHP_FE(myext_helloworld, NULL)(后面不要带分号)。

第四步

在myext.c末尾加myext_helloworld的执行代码。

PHP_FUNCTION(myext_helloworld)

{

    char *arg = NULL;

  int arg_len, len;

  char *strg;

  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {

    return;

  }

  php_printf("Hello World!\n");

  RETRUN_TRUE;

}

zend_parse_parameters是用来接受PHP传入的参数,RETURN_XXX宏是用来返回给PHP数据。

第五步

在myext目录下依次执行phpize、./configure 、make、make install。然后修改php.ini加入extension=myext.so

执行php -r “myext_helloworld(‘test');”,输出hello world!

(0)

相关推荐

  • PHP安装memcache扩展的步骤讲解

    PHP 5.6.23,查询目前最稳定的版本是memcache-2.2.7. 1.下载并解压缩. wget http://pecl.php.net/get/memcache-2.2.7.tgz tar zxvf memcache-2.2.7.tgz 2. 编译.根据实际情况使用phpize和php-config. [root@www memcache-2.2.7]# /usr/local/php/bin/phpize Configuring for: PHP Api Version: 201311

  • PHP7 mongoDB扩展使用的方法分享

    前言 最近在做的项目需要将PHP5.6升级到PHP7.0,使用过PHP-mongo扩展的同学应该知道,PHP7.0的mongodb扩展是完全不兼容PHP5.6的mongo扩展的,php-mongodb改如何使用呢. 下面直接说明各种方法的使用: 1.mongodb连接: private function connect($confArr) { try{ $connStr = "mongodb://" . $confArr['host'] . ":" . $confA

  • PHP扩展Swoole实现实时异步任务队列示例

    本文实例讲述了PHP扩展Swoole实现实时异步任务队列.分享给大家供大家参考,具体如下: 假如要发100封邮件,for循环100遍,用户直接揭竿而起,什么破网站! 但实际上,我们很可能有超过1万的邮件.怎么处理这个延迟的问题? 答案就是用异步.把"发邮件"这个操作封装,然后后台异步地执行1万遍.这样的话,用户提交网页后,他所等待的时间只是"把发邮件任务请求推送进队列里"的时间.而我们的后台服务将在用户看不见的地方跑. 在实现"异步队列"这点上,

  • PHP扩展mcrypt实现的AES加密功能示例

    本文实例讲述了PHP扩展mcrypt实现的AES加密功能.分享给大家供大家参考,具体如下: AES(Advanced Encryption Standard,高级加密标准)是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.Rijndael是在AES中使用的基本密码算法. 对于此算法网上流传有很多php代码实现的版本,其实php的扩展mcrypt完全支持此加密算法,不必要自己去写代码实现.先不说自己写费时费力(当然你若是想研究此加密算法,那另说)

  • PHP安装BCMath扩展的方法

    编译安装 (PHP-5.6.23) 1.进入PHP源码包目录下的ext/bcmath目录. [root@192 bcmath]# ls bcmath.c config.m4 config.w32 CREDITS libbcmath package.xml php_bcmath.h tests 2.执行phpize命令,phpize命令在PHP安装目录的bin目录下,如/usr/local/php/bin/phpize. [root@192 bcmath]# /usr/local/php/bin/

  • PHP基于mcript扩展实现对称加密功能示例

    本文实例讲述了PHP基于mcript扩展实现对称加密功能.分享给大家供大家参考,具体如下: 1.对称加密主要利用相同的密钥来实现,而非对称加密利用公钥和私钥来加密,比较而言对称加密速度快,但是安全性要低 为什么使用base64_encode(),主要是用于传参,直接加密完成后不是我们能理解的字符串,也就是大家所说的乱码 2.进行加密(使用mcript扩展,DES类型),关键点在于$key="key:1111",相同的密钥串 <?php header("content-t

  • PHP的Yii框架中YiiBase入口类的扩展写法示例

    通过yiic.php自动创建一个应用后,入口文件初始代码如下: <?php // change the following paths if necessary $yii=dirname(__FILE__).'/../yii/framework/yii.php'; $config=dirname(__FILE__).'/protected/config/main.php'; // remove the following lines when in production mode defined

  • php的扩展写法总结

    为什么要用C扩展 C是静态编译的,执行效率比PHP代码高很多.同样的运算代码,使用C来开发,性能会比PHP要提升数百倍.IO操作如CURL,因为耗时主要在IOWait上,C扩展没有明显优势. 另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据,C扩展可操作的范围更广. 第一步 下载PHP的源代码,如php-5.4.16.解压后进入php-5.4.16\ext目录.输入 ./ext_skel –extname=myext,myext就是扩展的名称,执行后生成myext目

  • JS扩展方法实例分析

    本文实例讲述了JS扩展方法实现技巧.分享给大家供大家参考.具体分析如下: JS扩展方法与C#的扩展方法非常相似,也是可以链式调用的,也是通过对某个类的扩展写法来实现.这个东西非常好用,如果将预先写好的方法放到一个js里面引用的话,那么后面写js将非常有趣. 下面给出一个例子: <head> <title>测试JS扩展方法</title> <script type="text/javascript"> // 合并多个空白为一个空白 Stri

  • js中比较两个对象是否相同的方法示例

    本文实例讲述了js中比较两个对象是否相同的方法.分享给大家供大家参考,具体如下: js中,很轻易就可以比较2个普通字符串/数字是否相同,但是,如何比较2个对象是否相同呢? 在此我便给出较为简单的方法,如下: //比较2个对象是否相同 function isObjEqual(o1,o2){ var props1 = Object.getOwnPropertyNames(o1); var props2 = Object.getOwnPropertyNames(o2); if (props1.leng

  • .NET Core基于Generic Host实现后台任务方法教程

    前言 很多时候,后台任务对我们来说是一个利器,帮我们在后面处理了成千上万的事情. 在.NET Framework时代,我们可能比较多的就是一个项目,会有一到多个对应的Windows服务,这些Windows服务就可以当作是我们所说的后台任务了. 我喜欢将后台任务分为两大类,一类是不停的跑,好比MQ的消费者,RPC的服务端.另一类是定时的跑,好比定时任务. 那么在.NET Core时代是不是有一些不同的解决方案呢?答案是肯定的. Generic Host就是其中一种方案,也是本文的主角. 什么是Ge

  • Postgres bytea类型 转换及查看操作

    一开发表里的列类型为 bytea ,可是它select出来的时候又不是想要的结果: 在postgres配置文件里修改参数 bytea_output = 'escape' 这个默认是hex类型的,修改成escape. 查看的时候还是不是想要的结果: select encode(data::bytea,'hex') from data_from_target limit 1; 补充:PostgreSQL的数据类型及日常实践笔记 数据类型是编程语言中,在其数据结构上定义的相同值类型的集合以及对该相同值

  • JavaScript常用方法和封装详情

    目录 1.字符串相关 1.1 format方法 2.数组相关 1.2 forEach(callback,context) 操作数组中的每一个元素 1.3 indexOf(searchvalue,fromindex) 查询数组中某一个值的下标 2.数组封装 1.字符串相关 1.1 format方法 在各种编程语言中,字符串的format方法是比较常见的,以下通过js扩展的方式,实现了js版本的format方法.目前貌似还没有浏览器支持这一个方法. if(!String.prototype.form

  • 详解Docker Compose配置文件参数

    目录 1. image 2. build 3. command 4.container_name 5.depends_on 6.dns 7. tmpfs 8. entrypoint 9.env_file 10. environment 11. expose 12. external_links 13. extra_hosts 14. labels 15. links 16. logging 17. pid 18. ports 19. security_opt 20. stop_signal 21

  • python格式化输出实例(居中、靠右及靠左对齐)

    目录 format 方式 其他扩展写法 '%' 方式 总结 format 方式 {: >} 靠右对齐 print('{0:>5}'.format('aa')) # 占5个字符空间,0是format参数中的变量索引 >> ' aa' {: <} 靠左对齐 print('{0:<5}'.format('aa')) # 占5个字符空间,0是format参数中的变量索引 >> 'aa ' {:^} 居中对齐 print('{0:^5}'.format('aa'))

  • java泛型中占位符T和?有什么区别

    泛型中占位符T和?有什么区别?这是一个好问题,有的人可能弄不清楚,所以我们这里简单的演示一下,相信大家一定能弄清楚的! 先上两段代码: public static <T> void show1(List<T> list){ for (Object object : list) { System.out.println(object.toString()); } } public static void show2(List<?> list) { for (Object

随机推荐