`

如何编写一个PHP的C扩展

    博客分类:
  • 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!

 

http://rango.swoole.com/archives/152

 

分享到:
评论

相关推荐

    如何编写一个PHP的C扩展.docx

    如何编写一个PHP的C扩展.docx如何编写一个PHP的C扩展.docx如何编写一个PHP的C扩展.docx

    开发PHP扩展详细教程

    操起google搜了一通,结果发现Zend已经写了一个如何编写php extension的教程: http://devzone.zend.com/article/1021-Extension-Writing-Part-I-Introduction-to-PHP-and-Zend 浏览完牛人的大作,更是信心...

    phalcon,一个c编写的php扩展型框架

    phalcon,一个c编写的php扩展型框架,由于基于C编写,运行速度杠杠的

    linux下编写自己的php扩展

    linux环境下用c编写php扩展。 内付问题邮箱。

    vs2008下用c、c++ 开发 PHP 扩展.doc

    整理的关于windows下开发PHP扩展的及环境搭建说明

    building-custom-php-extensions (编写自定义的PHP扩展模块, PHP扩展开发, PHP模块开发)

    自定义自己的PHP模块,用C语言开发自己的PHP函数,当我们想在PHP使用C语言强大的函数库的时候,我们可以通过编写自己的PHP函数过调用想要使用的其它C语言函数,使你的PHP程序更强大高效,要下的赶块...

    php扩展学习PDF

    很好的一本书,让我们更深刻地理解PHP的运行机制以及让自己可以编写自己的PHP扩展 需要C语言基础

    PHP扩展开发中文教程【PDF】

    既然您正在阅读本教程,那么您或许对编写PHP语言的扩展感兴趣。如果不是...呃,或许你并不知道这一兴趣,那么我们结束的时候你就会发现它。 本教程假定您基本熟悉PHP语言及其解释器实现所用的语言:C. 让我们从指明...

    PHP-X让有一定工作经验的PHP程序员都能扩展.doc

    于是我今年就冒出一个新的想法,基于我编写swoole扩展超过5年的经验,我试图在Zend API和C 之间建立一个包装层,让PHP扩展开发变得简单。有一定C 基础的PHPer都可以轻松得开发一个PHP扩展。   PHP-X这个...

    PHP的C扩展Zephir.zip

    Zephir 是一个开源的,可以用高级语言安全快速地编写 PHP 的 C 扩展。 Phalcon 2.0 已经改用 Zephir 重写。  根据 Phalcon 团队发布的博文: Phalcon 2.0 progress benchmarks;可以做到跟用C写几乎一样的...

    基于openssl密码库编写的sm2国密算法PHP扩展.rar

    EVP框架是对openssl提供的所有算法进行了封装,在使用工程中只需要...利用OpenSSL提供的库函数,用C/C++编写: 1.编写程序生成RSA密钥对,并保存公钥到文 openssl详解api编程 https://blog.51cto.com/u_16099174/6324509

    php-ext-embed:用C和PHP编写您PHP扩展!

    我们编写PHP扩展的原因很简单-在大多数情况下通过在C中实现关键算法来提高性能,但是围绕该算法您需要一些业务逻辑代码来包装它,而使用Zend API总是非常复杂,这使得绿色双手被困。 我们的工作允许您将PHP库植入...

    如何用C语言编写PHP扩展的详解

    本篇文章是对用C语言编写PHP扩展进行了详细的分析介绍,需要的朋友参考下

    基于C语言编写forp PHP分析器

    dtrace 分析器是一个轻量级的 PHP 扩展提供脚本的调用堆栈,CPU 和内存使用. 总结的特性 : PHP7 编译时要使用(--enable-dtrace) PHP7 使用时需要设置环境变量(export USE_ZEND_DTRACE=1) 每个函数的时间和分配内存...

    Leevel 高性能PHP扩展开发框 v1.0.0-alpha-1.zip

    Leevel 高性能 PHP 扩展开发框是一个开源 PHP C 扩展开发框架,采用 zephir 编写,是为了解决使用框架带来性能下降的经典矛盾,Leevel 是为了解决 QueryPHP 性能而开发,可以与同版本的 QueryPHP 混合使用,将接管 ...

    探讨:如何编写PHP扩展

    用C/C++扩展PHP的优缺点:优点:效率,还是效率减少PHP脚本的复杂度, 极端情况下, 你只需要在PHP脚本...如果你熟悉C,那么编写一个PHP扩展,并不是什么非常难的事情。 PHP本身就提供了一个框架,来简化你的开发。最简

    PHP-7.0-redis扩展文件

    Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希...

    Phalcon php框架 v2.0.2.zip

    PhalconPHP 是一个使用 C 扩展开发的 ...Phalcon 2.0 基于高性能编译语言Zephir,Zephir的目的是提供一个全新的更简单的语法来编写PHP扩展。   Phalcon 1.x还没完全迁移到Phalcon 2.0,比如目前数据库只支持MySQL。

    Leevel高性能PHP扩展开发框架 v1.0.0 alpha.2

    Leevel 高性能 PHP 扩展开发框架Leevel 是一个开源 PHP C 扩展开发框架,采用 zephir 编写,是为了解决使用框架带来性能下降的经典矛盾,Leevel 是为了解决 QueryPHP 性能而开发,可以与同版本的 QueryPHP 混合使用...

    Node.js C++原生扩展&PHP SAPI

    编写node的C/C++原生扩展在Node Js下执行PHP 开发环境:Window/Linux(我在Debian X64下编译通过) Linux下编译脚本 cd /root/php-5.4.26/ ./buildconf --force ./configure --with-node=/usr/local/node-v0.10.26 make...

Global site tag (gtag.js) - Google Analytics