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,将
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’);」を実行し、出力ハローワールド!