问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用C的扩展功能

发布网友 发布时间:2022-04-22 01:01

我来回答

1个回答

热心网友 时间:2022-04-16 06:12

  1:预定义
  在home目录,也可以其他任意目录,写一个文件,例如caleng_mole.def
  内容是你希望定义的函数名以及参数:
  int a(int x,int y)
  string b(string str,int n)
  2:到php源码目录的ext目录
  #cd /usr/local/php-5.4.0/ext/
  执行命令,生成对应扩展目录
  #./ext_skel --extname=caleng_mole --proto=/home/hm/caleng_mole.def
  3:修改config.m4
  去掉dnl的注释
  PHP_ARG_ENABLE(caleng_mole, whether to enable caleng_mole support,
  Make sure that the comment is aligned:
  [ --enable-caleng_mole Enable caleng_mole support])
  4:修改caleng_mole.c
  代码如下:
  /* {{{ 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);
  }
  /* }}} */
  5:生成扩展库
  #cd ./caleng_mole
  #/usr/local/php/bin/phpize
  #./configure --with-php-config=/usr/local/php/bin/php-config
  #make
  #make install
  6:到php的对应extensions目录
  如上图所示
  #cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
  改目录下有生成的caleng_mole.so文件
  7:修改php.ini
  php.ini如果找不到可以从phpinfo()打出的信息看到
  #cd /usr/local/php/lib/
  php.ini增加扩展信息
  extension=caleng_mole.so
  8:重启Apache
  # /usr/local/apache2/bin/apachectl restart
  9:检查加载
  /usr/local/php/bin/php -m
  10:PHP调用
  代码如下:
  echo a(1,2);
  输出 3 就说明成功了!
  下面是原文
  Linux下用C开发PHP扩展
  一、首先下载PHP源码包,假设源码包目录为:/software/php-5.2.13
  一、首先下载PHP源码包,假设源码包目录为:/software/php-5.2.13
  #> cd /software/php-5.2.13/ext
  二、假设我们要开发一个名为caleng_mole的扩展,该扩展包含两个函数:a--处理两个整型相加和b-处理字符串重复输出;
  1、首先编写一个函数定义文件,该文件编写函数原型后缀为def,假设为:caleng_mole.def
  int a(int x, int y)
  string b(string str, int n)
  2、通过扩展骨架生成器,将在ext目录下自动建立扩展目录caleng_mole
  #> ./ext_skel --extname=caleng_mole --proto=caleng_mole.def
  3、修改配置文件: #> vim /software/php-5.2.13/ext/caleng_mole/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_mole/caleng_mole.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_mole
  #> /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_mole.so文件
  在php.ini配置文件中加入: extension=caleng_mole.so.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
"你是在哪看到我的照片?"怎么说英语 留恋地看着我的照片用英语怎么说? 高德iphone地图下载 苹果手机高德地图怎么下载地图 孕中期适合出游吗 哪些孕妇不适合长途旅行 孕妇坐长途车旅行的好处 孕妇出游的最佳时间 孕晚期适合出游吗 孕妇外出旅行禁忌 小米11烧wifi啥表现 微信聊天语音占用太多怎么清理? 剥青核桃的手黑了,怎么洗干净? 如何使用c语言 调用vc++打开.c程序进行编辑? 如何使用c语言 调用vc++打开.c程序进行编辑? 青皮核桃汁弄到手上怎么清理呢 青皮核桃水弄手上怎么洗~ 怎么用C语言开发软件 怎么用C语言开发软件 青皮核桃汁弄手黑怎么办? 怎么用C语言打开一个应用程序 c语言软件怎么用 弹电子琴左手如何配音好听 如何运用C语言 c语言怎么用啊? 钢琴弹 祝你生日快乐 左手怎么配音。 怎么用C语言打开一个程序? 怎样用电子琴配音? 怎么用C语言? 怎么使用c语言中的. 钢琴左手配和弦技巧 如何使用C的扩展功能 怎么把微信的语音整理成文件 剥核桃时外绿皮时弄到手上的污渍怎么洗去? 如何把微信的语音整理成mp3 为什么摸了核桃的青皮,手会黑 如何快速把微信语音整理成文字 青核桃汁液弄到皮肤上,怎么办?洗不掉。要多久可... 怎样把微信语音聊天整理一起成一个文件 手机清理软件怎么清理微信语音 青皮核桃水染到手上怎么去 哪一款软件可以针对性清理微信语音文件? 剥核桃青皮的手弄黑了怎么办? 核桃皮染黑手怎么处理 如何把别人微信语音整理到微信笔记?谢谢 微信里的语音用什么清理? 微信语音清理怎么恢复 cpu有核显和没核显区别 闪电和雷产生的原理是什么? CPU带核显的好还是不带的好 为什么有闪电和雷?