Extend the PHP function with C: The integer in php is a signed number, and its internal implementation is actually long, not unsigned long. For 32-bit machines, the maximum integer that php can represent is 2 ^ 31-1, generally, the numbers larger than 2 ^ 31-1 and smaller than 2 ^ 32 can only be represented by strings. For mixed int_ext (string in), if the integer in the string is less than 2 ^ 31-1, an integer is returned. if it is greater than, a string is returned.
The steps for developing extension are as follows: (first download the php source code)
1. create an extension skeleton
cd php-5.3.14/ext ./ext_skel --extname=int_ext
2. modify compilation parameters
cd php-5.3.14/ext/int_ext vi config.m4
Remove PHP_ARG_ENABLE (int_ext, whether to enable int_ext support and
[-- Enable-int_ext Enable int_ext support]) The dnl before the two rows is changed:
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. write C code
cd php-5.3.14/ext/int_ext vi php_int_ext.h
Add a line of PHP_FUNCTION (int_ext) after PHP_FUNCTION (confirm_int_ext_compiled );
cd php-5.3.14/ext/int_ext vi int_ext.c
Add PHP_FE (int_ext, NULL) after PHP_FE (confirm_int_ext_compiled, NULL) and then:
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[] */ };
Core code:
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. Compile
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
A so file will be generated:/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/int_ext.so
Modify php. ini to add extended extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613 /"
[int_ext]extension = int_ext.so
5. test
$ A = int_ext ("12345678900"); var_dump ($ a); $ a = int_ext ("123456789"); var_dump ($ a); result output: string (11) "12345678900" int (123456789)