`

如何编写一个PHP的C扩展

 
阅读更多

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

分享到:
评论

相关推荐

    如何用C语言编写一个PHP的C扩展.zip

    在IT行业中,C语言是一种底层且高效的编程语言,而PHP是一种广泛应用的服务器端脚本语言。将两者结合,可以通过编写C扩展来增强PHP的功能,提高性能。...不断地试验和学习,你将成为编写PHP C扩展的专家。

    使用c语言开发php扩展教程

    最后,创建一个PHP文件(如`test2.php`),调用C语言编写的扩展函数,运行这个文件,如果一切顺利,你应该能看到预期的输出结果,这就表明你已经成功地使用C语言开发了一个PHP扩展,并在PHP环境中正确地调用了它。...

    linux下编写自己的php扩展

    在Linux环境下使用C语言编写PHP扩展是一种常见的技术手段,尤其对于那些需要高性能处理的任务而言尤为重要。通过编写PHP扩展,开发者能够利用C语言的强大功能来增强PHP的功能性和性能。本文将详细介绍如何在Linux...

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

    Phalcon是一个高效且高度优化的PHP框架,它以C语言编写,从而提供了比纯PHP代码更高的执行速度。作为一款扩展型框架,Phalcon被设计为直接集成到PHP解释器中,成为PHP的一部分,使得Web应用的性能得到显著提升。这个...

    使用C语言来扩展PHP,写PHP扩展dll

    ### 使用C语言扩展PHP:构建PHP扩展DLL #### 前言 随着PHP的应用范围不断扩大,对于性能的要求也日益提高。而C语言作为一种底层语言,其执行效率远高于PHP这样的高级语言。因此,通过C语言编写PHP扩展可以显著提升...

    开发PHP扩展详细教程

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

    简单高性能优雅的phpc扩展框架

    【标题】"简单高性能优雅的phpc扩展框架"所指的是一个专门为PHP设计的C扩展框架,旨在提升PHP应用的性能并提供简洁优雅的编程体验。C扩展是将PHP功能用C语言编写,然后编译为PHP可以调用的模块,这样能够利用C语言的...

    php写扩展文档

    本文将通过实例介绍如何开发一个简单的PHP扩展——“Hello World”扩展,并逐步讲解整个过程。 #### 二、准备工作 首先,我们需要准备一个适合开发PHP扩展的环境。本文示例基于如下环境: - **操作系统**:CentOS...

    php扩展学习PDF

    2. **PHP扩展基础**:讲解如何创建一个简单的PHP扩展,包括定义函数、类、常量等,以及如何编译和安装扩展。 3. **资源管理**:讨论如何管理和释放PHP扩展中使用的内存,避免内存泄漏和其他资源管理问题。 4. **...

    zehphir代码 zephir编写PHP扩展

    7. **Xavier关联**:在压缩包文件名称列表中提到了"Xavier",这可能是一个示例项目或库,展示了如何使用Zephir编写PHP扩展。通过对Xavier源代码的学习,开发者可以进一步了解Zephir的实际应用和最佳实践。 总之,...

    C语言编写的PHP扩展-MVC框架,以高性能为目标。.zip

    总结来说,这个项目的目标是创建一个用C语言编写、针对PHP的高性能MVC框架扩展。开发者需要对PHP的C API有深入了解,掌握C语言编程,并熟悉MVC设计模式。通过这样的扩展,可以提升PHP应用的运行效率,特别是对于高...

    Linux/FreeBSD下用C语言开发PHP的so扩展模块例解

    在Linux和FreeBSD操作系统上,使用...总的来说,开发PHP的C语言扩展需要对PHP内核有深入的理解,同时也需要扎实的C语言基础。通过不断实践和学习,开发者可以创建出强大且高效的自定义扩展,为PHP应用增添新的活力。

    php 扩展调用so动态库 教程

    该教程分为两部分,第一部分主要介绍如何创建一个基本的 PHP 扩展库,第二部分则介绍如何在扩展库中调用 C 语言编写的共享库。 第一部分:创建基本的 PHP 扩展库 在开始之前,需要搭建 LAMP 环境,并检查 PHPize ...

    企业微信会话内容存档php扩展.zip

    总结一下,这个“企业微信会话内容存档php扩展.zip”包含了一个PHP用C语言编写的扩展库和一个示例代码,使得PHP开发者能够方便地集成企业微信的会话内容存档功能,适用于PHP 7.0及以上版本。开发者可以通过示例代码...

    cygwin windown php扩展开发工具

    PHP扩展是用C语言编写的,它们通过ZEND引擎与PHP内核交互,提供新的功能或者增强已有功能。使用Cygwin,开发者可以在Windows系统上构建这些C扩展,而无需安装完整的Linux环境。以下是一些使用Cygwin进行PHP扩展开发...

Global site tag (gtag.js) - Google Analytics