PHPのC拡張機能の作成方法
2061 ワード
なぜCで拡張するのか
Cは静的にコンパイルされており,PHPコードよりも実行効率が高い.同様の演算コードはCを用いて開発され,PHPよりも数百倍性能が向上する.IOはCURLのように動作し、主にIOWait上で時間がかかるため、C拡張には明らかな優位性がない.
またC拡張はプロセス起動時にロードされ、PHPコードはRequestライフサイクルのデータのみを操作でき、C拡張は操作可能な範囲が広い.
最初のステップ
php-5.4などのPHPのソースコードをダウンロードします.16.解凍後php-5.4に入る.16extディレクトリ.入力./ext_skel--extname=myext、myextは拡張の名前で、実行後にmyextディレクトリを生成します.
ext_skelはPHP公式に提供されているphp拡張スケルトンコードを生成するためのツールです.
cd myext.php_が見えますmyext.h、myext.c、config.m 4などいくつかのファイル.config.m 4は、さまざまなコンパイルオプションを変更するためのAutoConfツールのプロファイルです.
ステップ2
configを修正する.m 4,将
次のように変更
下にはphpカーネルにコンパイルされたことを示す-enable-myextもあります.withはダイナミックリンクライブラリとしてロードされます.
ステップ3
php_の変更myext.h,PHPが見えるFUNCTION(confirm_myext_compiled); ここでは拡張関数宣言部分で、PHPを1行追加できます.FUNCTION(myext_helloworld); myext_を宣言したことを示します.helloworldの拡張関数.
そしてmyext.を変更します.c,これは拡張関数の実装部分である.
このコードは、関数ポインタをZendエンジンに登録し、PHPを1行追加します.FE(myext_helloworld,NULL)(後にセミコロンは付けない)
ステップ4
myext.c末尾にmyext_を付けるhelloworldの実行コード.
zend_parse_parametersはPHP入力を受け入れるためのパラメータ、RETURN_XXXマクロはPHPデータを返すために使用されます.
ステップ5
myextディレクトリの下でphpize、./configure 、make、make install.phpを変更します.ini加入extension=myext.so
php-r「myext_helloworld(‘test’);」を実行し、出力ハローワールド!
Cは静的にコンパイルされており,PHPコードよりも実行効率が高い.同様の演算コードはCを用いて開発され,PHPよりも数百倍性能が向上する.IOはCURLのように動作し、主にIOWait上で時間がかかるため、C拡張には明らかな優位性がない.
またC拡張はプロセス起動時にロードされ、PHPコードはRequestライフサイクルのデータのみを操作でき、C拡張は操作可能な範囲が広い.
最初のステップ
php-5.4などのPHPのソースコードをダウンロードします.16.解凍後php-5.4に入る.16extディレクトリ.入力./ext_skel--extname=myext、myextは拡張の名前で、実行後にmyextディレクトリを生成します.
ext_skelはPHP公式に提供されているphp拡張スケルトンコードを生成するためのツールです.
cd myext.php_が見えますmyext.h、myext.c、config.m 4などいくつかのファイル.config.m 4は、さまざまなコンパイルオプションを変更するためのAutoConfツールのプロファイルです.
ステップ2
configを修正する.m 4,将
dnl PHP_ARG_WITH(myext, for myext support,
dnl Make sure that the comment is aligned:
dnl [ --with-myext Include myext support])
次のように変更
PHP_ARG_WITH(myext, for myext support,
[ --with-myext Include myext support])
下にはphpカーネルにコンパイルされたことを示す-enable-myextもあります.withはダイナミックリンクライブラリとしてロードされます.
ステップ3
php_の変更myext.h,PHPが見えるFUNCTION(confirm_myext_compiled); ここでは拡張関数宣言部分で、PHPを1行追加できます.FUNCTION(myext_helloworld); myext_を宣言したことを示します.helloworldの拡張関数.
そしてmyext.を変更します.c,これは拡張関数の実装部分である.
const zend_function_entry myext_functions[] = {
PHP_FE(confirm_myext_compiled, NULL) /* For testing, remove later. */
PHP_FE(myext_helloworld, NULL)
PHP_FE_END /* Must be the last line in myext_functions[] */
};
このコードは、関数ポインタをZendエンジンに登録し、PHPを1行追加します.FE(myext_helloworld,NULL)(後にセミコロンは付けない)
ステップ4
myext.c末尾にmyext_を付けるhelloworldの実行コード.
PHP_FUNCTION(myext_helloworld)
{
char *arg = NULL;
int arg_len, len;
char *strg;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
return;
}
php_printf("Hello World!
");
RETRUN_TRUE;
}
zend_parse_parametersはPHP入力を受け入れるためのパラメータ、RETURN_XXXマクロはPHPデータを返すために使用されます.
ステップ5
myextディレクトリの下でphpize、./configure 、make、make install.phpを変更します.ini加入extension=myext.so
php-r「myext_helloworld(‘test’);」を実行し、出力ハローワールド!