CでPHPを拡張する
3828 ワード
関数機能: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、拡張スケルトンの作成
2、コンパイルパラメータの修正
PHPを取り除くARG_ENABLE(int_ext,whether to enable int_ext supportおよび[--enable-int_ext Enable int_ext support])の2行前のdnlを次のように変更します.
3、Cコードの作成
PHP_FUNCTION(confirm_int_ext_compiled); 後にPHPが1行追加されました.FUNCTION(int_ext);
PHP_FE(confirm_int_ext_compiled,NULL)の後にPHP_を追加FE(int_ext,NULL)を追加すると次のようになります.
コアコード:
4、コンパイル
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/”
5、テスト
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])の2行前の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が1行追加されました.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)