如何用c语言在windows平台上开发php extension

 我来答
huanglenzhi
推荐于2016-01-11 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517193
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
  如何使用C语言开发PHP扩展。

  函数功能:php里面的整数是有符号数,其内部实现其实就是long,不是unsigned long。对于32位机器来说,php最大能表示的整数就是2^31-1了,一般在应用中碰到大于2^31-1而小于2^32的数就只能用字符串来表示了。对于mixed int_ext(string in)来说,如果字符串in表示的整数小于2^31-1,那么就返回整数,如果大于就返回字符串。

  开发扩展步骤如下:(首先需要下载php的源码,这里下载的是php-5.3.14)

  1,建立扩展骨架

  [plain] view plaincopyprint?
  01.cd php-5.3.14/ext
  02../ext_skel --extname=int_ext
  cd php-5.3.14/ext
  ./ext_skel --extname=int_ext
  2,修改编译参数

  [plain] view plaincopyprint?
  01.cd php-5.3.14/ext/int_ext
  02.vi config.m4
  cd php-5.3.14/ext/int_ext
  vi config.m4去掉 PHP_ARG_ENABLE(int_ext, whether to enable int_ext support 和
  [ --enable-int_ext Enable int_ext support]) 两行前面的dnl 修改后为:

  [plain] view plaincopyprint?
  01.1. dnl Otherwise use enable:
  02.2. PHP_ARG_ENABLE(int_ext, whether to enable int_ext support,
  03.3. dnl Make sure that the comment is aligned:
  04.4. [ --enable-int_ext Enable int_ext support])
  1. dnl Otherwise use enable:
  2. PHP_ARG_ENABLE(int_ext, whether to enable int_ext support,
  3. dnl Make sure that the comment is aligned:
  4. [ --enable-int_ext Enable int_ext support])
  3,编写C代码

  [plain] view plaincopyprint?
  01.cd php-5.3.14/ext/int_ext
  02.vi php_int_ext.h
  03.#在 PHP_FUNCTION(confirm_int_ext_compiled); 后面新增一行 PHP_FUNCTION(int_ext);
  cd php-5.3.14/ext/int_ext
  vi php_int_ext.h
  #在 PHP_FUNCTION(confirm_int_ext_compiled); 后面新增一行 PHP_FUNCTION(int_ext);[plain] view plaincopyprint?
  01.cd php-5.3.14/ext/int_ext
  02.vi int_ext.c
  03.#在PHP_FE(confirm_int_ext_compiled, NULL) 后面添加 PHP_FE(int_ext, NULL)添加后为:
  04.1. zend_function_entry int_ext_functions[] = {
  05.2. PHP_FE(confirm_int_ext_compiled, NULL) /* For testing, remove later. */
  06.3. PHP_FE(int_ext, NULL) /* For testing, remove later. */
  07.4. {NULL, NULL, NULL} /* Must be the last line in int_ext_functions[] */
  08.5. };
  cd php-5.3.14/ext/int_ext
  vi int_ext.c
  #在PHP_FE(confirm_int_ext_compiled, NULL) 后面添加 PHP_FE(int_ext, NULL)添加后为:
  1. zend_function_entry int_ext_functions[] = {
  2. PHP_FE(confirm_int_ext_compiled, NULL) /* For testing, remove later. */
  3. PHP_FE(int_ext, NULL) /* For testing, remove later. */
  4. {NULL, NULL, NULL} /* Must be the last line in int_ext_functions[] */
  5. };
  核心代码:

  [plain] view plaincopyprint?
  01.PHP_FUNCTION(int_ext)
  02.{
  03. char * str = NULL;
  04. int str_len;
  05. int argc = ZEND_NUM_ARGS();
  06. if(zend_parse_parameters(argc TSRMLS_CC,"s",&str,&str_len) == FAILURE)
  07. return ;
  08. char * result;
  09. int result_length = str_len;
  10. result = (char *) emalloc(result_length + 1);
  11. memcpy(result,str,result_length);
  12. unsigned long result_num = strtoul(result, NULL, 10);
  13. int sizeoflong sizeof(long);
  14. unsigned long max_long = 1 << (sizeoflong * 8 -1);
  15. if(result_num < max_long)
  16. {
  17. RETURN_LONG(result_num);
  18. }
  19. else
  20. {
  21. RESULT_STRINGL(result, result_length, 0);
  22. }
  23.}
  PHP_FUNCTION(int_ext)
  {
  char * str = NULL;
  int str_len;
  int argc = ZEND_NUM_ARGS();
  if(zend_parse_parameters(argc TSRMLS_CC,"s",&str,&str_len) == FAILURE)
  return ;
  char * result;
  int result_length = str_len;
  result = (char *) emalloc(result_length + 1);
  memcpy(result,str,result_length);
  unsigned long result_num = strtoul(result, NULL, 10);
  int sizeoflong sizeof(long);
  unsigned long max_long = 1 << (sizeoflong * 8 -1);
  if(result_num < max_long)
  {
  RETURN_LONG(result_num);
  }
  else
  {
  RESULT_STRINGL(result, result_length, 0);
  }
  }

  4,编译

  [plain] view plaincopyprint?
  01.cd php-5.3.14/ext/int_ext
  02./usr/local/php/bin/pphpize
  03../configure --with-php-config=/usr/local/php/bin/php-config
  04.make
  05.make install
  cd php-5.3.14/ext/int_ext
  /usr/local/php/bin/pphpize
  ./configure --with-php-config=/usr/local/php/bin/php-config
  make
  make install
  此时会产生一个so文件: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/int_ext.so
  修改php.ini 添加扩展extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"

  [int_ext]

  extension = int_ext.so

  5,测试

  [plain] view plaincopyprint?
  01.$a = int_ext("12345678900");
  02.var_dump($a);
  03.$a = int_ext("123456789");
  04.var_dump($a);
  $a = int_ext("12345678900");
  var_dump($a);
  $a = int_ext("123456789");
  var_dump($a);
  结果输出:

  [plain] view plaincopyprint?
  01.string(11) "12345678900"
  02.int(123456789)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式