Use C to expand PHP

Source: Internet
Author: User
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)

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.