如何编写一个抢购bot_如何编写一个 PHP 的 C 扩展

(给PHP开发者加星标,提升PHP技能)

转自:韩天峰

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

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

1dnl PHP_ARG_WITH(myext, for myext support,
2dnl Make sure that the comment is aligned:
3dnl [  --with-myext             Include myext support])
4修改为
5
6PHP_ARG_WITH(myext, for myext support,
7[  --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,这个是扩展函数的实现部分。

1const zend_function_entry myext_functions[] = {
2        PHP_FE(confirm_myext_compiled,  NULL)           /* For testing, remove later. */
3        PHP_FE(myext_helloworld,  NULL)
4        PHP_FE_END      /* Must be the last line in myext_functions[] */
5};

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

第四步

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

 1PHP_FUNCTION(myext_helloworld)
2{
3        char *arg = NULL;
4    int arg_len, len;
5    char *strg;
6    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
7        return;
8    }
9    php_printf("Hello World!\n");
10    RETRUN_TRUE;
11}

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!

- EOF -

推荐阅读   点击标题可跳转

1、PHP局部变量、静态变量、全局变量和超全局变量的使用和区别

2、理解 PHP 对象注入

3、关于服务器 PHP 错误日志详解

看完本文有收获?请分享给更多人

关注「PHP开发者」加星标,提升PHP技能

44ddce1926f9f86cc19b89dce842f9db.png

点赞和在看就是最大的支持❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值