源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-01-18 01:37 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:如何用C语言编写PHP扩展的详解
[b]1:预定义 [/b]在home目录,也可以其他任意目录,写一个文件,例如caleng_module.def 内容是你希望定义的函数名以及参数: int a(int x,int y) string b(string str,int n) [b]2:到php源码目录的ext目录 [/b]#cd /usr/local/php-5.4.0/ext/ 执行命令,生成对应扩展目录 #./ext_skel --extname=caleng_module --proto=/home/hm/caleng_module.def [b]3:修改config.m4 [/b]去掉dnl的注释 PHP_ARG_ENABLE(caleng_module, whether to enable caleng_module support, Make sure that the comment is aligned: [  --enable-caleng_module           Enable caleng_module support]) [b]4:修改caleng_module.c [/b]
[u]复制代码[/u] 代码如下:
/* {{{ proto int a(int x, int y)     */ PHP_FUNCTION(a) {  int argc = ZEND_NUM_ARGS();  int x;  int y;     int z;  if (zend_parse_parameters(argc TSRMLS_CC, "ll", &x, &y) == FAILURE)   return; z=x+y;   RETURN_LONG(z); } /* }}} */ /* {{{ proto string b(string str, int n)     */ 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); } /* }}} */
[b]5:生成扩展库 [/b]#cd ./caleng_module #/usr/local/php/bin/phpize #./configure --with-php-config=/usr/local/php/bin/php-config #make #make install [img]http://files.jb51.net/file_images/article/201306/201306131139116.gif[/img] [b]6:到php的对应extensions目录 [/b]如上图所示 #cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/ 改目录下有生成的caleng_module.so文件 [b]7:修改php.ini [/b]php.ini如果找不到可以从phpinfo()打出的信息看到 #cd /usr/local/php/lib/ php.ini增加扩展信息 extension=caleng_module.so   [b]8:重启Apache [/b]# /usr/local/apache2/bin/apachectl restart [b]9:检查加载 [/b] /usr/local/php/bin/php -m [b]10:PHP调用 [/b]
[u]复制代码[/u] 代码如下:
echo a(1,2);
输出 3  就说明成功了! ================================= 下面是原文 [b]Linux下用C开发PHP扩展 [/b]一、首先下载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. 搞定收工
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部