ホームページ >バックエンド開発 >PHPチュートリアル >C を使用した PHP の拡張
関数: PHP の整数は符号付きの数値であり、その内部実装は実際には unsigned long ではなく long です。 32 ビット マシンの場合、PHP が表現できる最大整数は 2^31-1 です。通常、アプリケーションで 2^31-1 より大きく 2^32 より小さい数値が発生した場合、それは次の形式でのみ表現できます。文字列。混合 int_ext(string in) の場合、文字列 in で表される整数が 2^31-1 より小さい場合は整数が返され、文字列より大きい場合は文字列が返されます。 [ --enable-int_ext int_ext サポートを有効にする]) 2 行の前の dnl は次のように変更されます:
cd php-5.3.14/ext ./ext_skel --extname=int_ext
3、C コードを作成します
cd php-5.3.14/ext/int_ext vi config.m4
PHP_FUNCTION の後に新しい行 PHP_FUNCTION(int_ext);
を追加します(confirm_int_ext_compiled);
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])
PHP_FE(confirm_int_ext_compiled, NULL) の後に PHP_FE(int_ext, NULL) を追加:
cd php-5.3.14/ext/int_ext vi php_int_ext.h
コアコード:
cd php-5.3.14/ext/int_ext vi int_ext.c
4、コンパイル
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[] */ };
A 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/”
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); } }
5、テスト
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