为什么要用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!

c扩展开发的更多相关文章

  1. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

  2. PHP 扩展开发(将自己的一些代码封装成PHP扩展函数)

    今天时间不多,先给个地址,能搜到我这篇blog的朋友先看看我最近在看的一些文章.资料吧: 我的环境是 lnmp1.1 的 (LNMP一键安装包),所以要进行PHP扩展开发首先应该对环境配置和shell ...

  3. 关于PHP扩展开发(收藏)

    一.Linux shell命令: ls –lh    查看文件大小 du –a    查看文件及文件夹大小 -------------------------- nginx ------------- ...

  4. postgres扩展开发

    扩展开发的基本组成 demo--1.0.sql demo.c demo.control Makefile demo.c当中包含了自定义函数的实现,纯C语言,目录下可包含多个.c文件.demo-1.0. ...

  5. 【转发】NPAPI学习(Firefox和Chrome扩展开发 )

    NPAPI学习(Firefox和Chrome扩展开发 ) 2011-11-08 14:41:02 by [6yang], 1172 visits, 收藏 | 返回 Firefox和Chrome扩展开发 ...

  6. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  7. PHP扩展开发相关总结

    1.线程安全宏定义 在TSRM/TSRM.h文件中有如下定义 #define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, ...

  8. Firefox扩展开发

    Firefox扩展开发 (插件开发) Extension开发 入门教程 5步走 五步走   首先需要知道什么是"Firefox插件".这里说的"插件"只是一个通 ...

  9. Chrome浏览器扩展开发系列之十四

    Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 时间:2015-10-08 16:17:59      阅读:1361      评论:0      收藏:0    ...

  10. Chrome扩展开发(Gmail附件管理助手)系列之〇——概述

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

随机推荐

  1. python_flask 注册,登陆,退出思路 ---纯个人观点

    1注册逻辑首先查询数据库用户名 并判断用户是否存在,如不存在就插入数据 并返回响应给前端2前端模板获取注册信息 判断 用户名不能为空及密码不能为空,和密码不一致 拼接注册url 组成get获取对象 响 ...

  2. threadPoolExecutor的基本解析

    线程池的构造方法中常见参数简介 corepoolsize:核心线程数,即便这里的线程处于空闲状态,也不会被回收,会一直存在线程池中 maxmumpoolsize:线程池所能容纳的最大线程数,超过这个数 ...

  3. gpg签名用法

    – 在CentOS 6上生成公钥/私钥对 [root@localhost ~]# gpg --gen-key gpg (GnuPG) ; Copyright (C) Free Software Fou ...

  4. postgresSQL主从流复制安装

    命令行运维: https://blog.csdn.net/zhangzeyuaaa/article/details/77941039 安装流程: 先准备类库: yum -y install readl ...

  5. 43.1-CAN通讯

    43-CAN通讯 1.CAN 协议简介 CAN是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子 产品著称的德国 BOSCH 公司开发的,并最终成为国际 ...

  6. 014-并发编程-java.util.concurrent之-CountDownLatch

    一.概述 CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,指定的一个或多个线程等待其他线程执行完成后执行. 能够使一个线程等待其他线程完成各自的工 ...

  7. jquery中把一串字符串分割,如:123456789后者abcdefg类型的

    函数:slice() 功能:arrayObject.slice(start,end) start:必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说,-1 指最后一个元 ...

  8. [css]table的拆分

    https://blog.csdn.net/qq_35415600/article/details/70237433 <body> <table border="1&quo ...

  9. (转)Thread中yield方法

    先上一段代码 public class YieldExcemple { public static void main(String[] args) { Thread threada = new Th ...

  10. spring注解注入的学习

    spring在开发中起到管理bean的作用,不管是web应用还是应用软件开发.注入有多种方式,其中注解注入最为受欢迎.(java api 在1.6版本以上才引入关键的注解类如:@Resource) 配 ...