用C扩展PHP

WBOY
WBOYOriginal
2016-06-23 14:32:261191browse

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

开发扩展步骤如下:(首先需要下载php的源码)

1,建立扩展骨架

cd php-5.3.14/ext  ./ext_skel --extname=int_ext

2,修改编译参数

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 修改后为:

dnl Otherwise use enable:    PHP_ARG_ENABLE(int_ext, whether to enable int_ext support,    dnl Make sure that the comment is aligned:    [  --enable-int_ext           Enable int_ext support])

3,编写C代码

cd php-5.3.14/ext/int_ext  vi php_int_ext.h

在 PHP_FUNCTION(confirm_int_ext_compiled); 后面新增一行 PHP_FUNCTION(int_ext);

cd php-5.3.14/ext/int_ext  vi int_ext.c

在PHP_FE(confirm_int_ext_compiled, NULL) 后面添加 PHP_FE(int_ext, NULL)添加后为:

zend_function_entry int_ext_functions[] = {    PHP_FE(confirm_int_ext_compiled, NULL) /* For testing, remove later. */    PHP_FE(int_ext, NULL)              /* For testing, remove later. */    {NULL, NULL, NULL}             /* Must be the last line in int_ext_functions[] */     };

核心代码:

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,编译

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,测试

$a = int_ext("12345678900");  var_dump($a);  $a = int_ext("123456789");  var_dump($a);   结果输出:string(11) "12345678900"  int(123456789)

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:PHP 4.4.0发布Next article:让Tomcat支持PHP