中易网

如何编写一个PHP的C扩展

答案:2  悬赏:20  
解决时间 2021-01-18 06:14
如何编写一个PHP的C扩展
最佳答案
一、首先下载PHP源码包,假设源码包目录为:/software/php-5.2.13
一、首先下载PHP源码包,假设源码包目录为:/software/php-5.2.13
#> cd /software/php-5.2.13/ext
二、假设我们要开发一个名为caleng_module的扩展,该扩展包含两个函数:a--处理两个整型相加和b-处理字符串重复输出;
1、首先编写一个函数定义文件,该文件编写函数原型后缀为def,假设为:caleng_module.def
int a(int x, int y)
string b(string str, int n)
2、通过扩展骨架生成器,将在ext目录下自动建立扩展目录caleng_module
#> ./ext_skel --extname=caleng_module --proto=caleng_module.def
3、修改配置文件: #> vim /software/php-5.2.13/ext/caleng_module/config.m4,将如下行的注释标签"dnl"去掉,修改后如下所示:
PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support,
Make sure that the comment is aligned:
[ --enable-myfunctions Enable myfunctions support])
4、完善函数a和b的功能: #> vim /software/php-5.2.13/ext/caleng_module/caleng_module.c
PHP_FUNCTION(a)
{
int x, y, z;

int argc = ZEND_NUM_ARGS();

if (zend_parse_parameters(argc TSRMLS_CC, "ll", &x, &y) == FAILURE)
return;
z = x + y;
RETURN_LONG(z);
}
PHP_FUNCTION(b)
{
char *str = NULL;
int argc = ZEND_NUM_ARGS();
int str_len;
long n;
char *result;
char *ptr;
int result_length;

if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE)
return;
result_length = str_len * n;
result = (char *) emalloc(result_length + 1);
ptr = result;
while (n--) {
memcpy(ptr, str, str_len);
ptr += str_len;
}
*ptr = '\0';
RETURN_STRINGL(result, result_length, 0);
}
三、编译安装,假设php的安装目录为:/usr/localhost/webserver/php
#> cd /software/php-5.2.13/ext/caleng_module
#> /usr/localhost/webserver/php/bin/phpize
#> ./configure --with-php-config=/usr/localhost/webserver/php/bin/php-config
#> make
#> make install
现在将在/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613目录下生成caleng_module.so文件
在php.ini配置文件中加入: extension=caleng_module.so.
搞定收工
全部回答
同样的运算代码,使用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)PHP_FE(myext_helloworld, NULL)PHP_FE_END };这的代码是将函数指针注册到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数据。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
奥丁领域ps3版和ps4版比怎么样
朋来超市怎么去啊,我要去那办事
PA尼龙具体分几大类?除了PA66、PA6.PA610.PA
极品调教的介绍
耶稣几天以后复活升天的?
mysql数据库中存进的是中文,为什么查出来的
求一篇小说!速度!跪求啊,挥泪求啊!!!
港版的iphone6p可以用电信卡吗
男62年金命和女64年火详解
了解男人的内心世界
心里甜蜜蜜的甜是什么意思
求tvb飞虎第一部 巾帼枭雄1 2部粤语中字网盘
有谁文言文好啊,,我写了点,,帮忙挑挑错,
怎样用索尼的media go将无损转换aac?难道默
和mian有关的成语
推荐资讯
珍珠鸟 你从选文中体会到了作者对小珍鸟怎样
How is the weather?的同义句
6.5寸866支持华为映射么
文泰如何把矩形做成弯型的
我们公司要入驻百度百家号,但是遇到名称被占
课桌面的面积约是42什么
开迈腾的都是有钱人吗,不是司机
与之相对的是用英语怎么说
PPR 给水管在40度至50度之间是不是容易爆管
从松岗地铁站坐地铁到深圳火车站怎么坐
如果不买摄像头,ns尬舞的体验是不是比ps4好
如何解决win7运行程序时显示“从服务器返回一
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?