PHP拡張機能の開発
私は、この一連のブログ投稿で PHP 拡張機能の開発について学んだことと洞察を要約し、Linux システムで PHP 拡張機能を開発するために知っておくべき最も基本的な知識を簡単かつ明確に説明するつもりです。レベルが低いので間違いがあるかもしれませんがご指摘ください。
準備
まず、PHP ソース コードのコピーを取得し (Github からチェックアウトするか、公式 Web サイトから最新の安定バージョンをダウンロードできます)、コンパイルします。コンパイルを高速化するには、余分な拡張機能をすべて無効にすること (--disable-all オプションを使用) をお勧めしますが、デバッグ (--enable-debug オプションを使用) とスレッド セーフ (--enable-maintainer を使用) をオンにすることをお勧めします。 -zts)、ただし、拡張機能を公開するときにデバッグをオフにし、状況に応じてスレッド セーフをオンにするかどうかを選択する必要があります:
コンパイルされた PHP 実行可能プログラムは、ソース コードの sapi ディレクトリにあります。将来的には、主に cli (コマンド ライン インターフェイス) 環境を使用することになります。 :
便利なコマンドライン オプションがいくつかあります:
#コード内でコードを実行します
拡張スケルトン
PHP のすべての公式拡張機能はソース コードの ext ディレクトリにあり、独自の拡張機能もこのディレクトリに配置できます。このディレクトリには、PHP 拡張機能のスケルトンを生成するために使用される ext_skel という名前のシェル スクリプトがあることに注意してください。このスクリプトを使用すると、PHP 拡張機能をすばやく作成できます。
コードの大部分はすでにコンパイルされているため、このコンパイルは非常に高速になるはずです。 PHP には拡張機能をコンパイルする別の方法 (拡張機能を .so ファイルにコンパイルする動的リンクを使用する) がありますが、拡張機能を開発する場合は静的コンパイルを使用することをお勧めします。これにより、構成ファイルに拡張機能をロードする必要がなくなるためです。
すべてがうまくいけば、最初の拡張機能を実行する準備が整います:
拡張機能を手動で作成する
ほとんどのチュートリアルでは、ext_skel 拡張スケルトンをプロトタイプとして使用して、拡張機能の開発を説明します。もちろん、このアプローチは非常に便利で高速です。しかし、私は個人的には拡張機能を純粋に手作業で開発することを好みます。なぜなら、あらゆる詳細を理解するのが簡単だからです。
拡張機能を手動で作成するには、まず ext ディレクトリに入り、拡張機能ディレクトリ myext2 を作成します。いくつかのファイルが必要です: config.m4、myext2.c、php_myext2.h。
まず、構成ファイル config.m4 を書きましょう:
if テスト "PHP_MYEXT2" != "no" then
PHP_NEW_EXTENSION(myext2, myext2.c, $ext_shared)
ふぃ
PHP_ARG_ENABLE は、autoconf 用に PHP によって定義されたマクロ関数です。Myext2 はその最初のパラメータであり、最後の 2 つのパラメータは make と configure が実行されるときの表示にのみ使用されるため、必要なものを自由に記述できます。 [ ] は、autoconf 構文の二重引用符のように機能し、文字列をラップするために使用されます (2 番目のパラメーターにはスペースが含まれていますが、角括弧で囲む必要はないことに注意してください)。拡張機能がデフォルトでオンであるかオフであるかを示すために使用される 4 番目のパラメーターもあります (デフォルトは no)。
次の 3 行は、実際には PHP_MYEXT2 拡張モジュールが有効になっているかどうかを判断するためのシェル構文です。拡張モジュールが有効になっている場合 (--enable-myext2)、$PHP_MYEXT2 変数の値は no ではないため、PHP_NEW_EXTENSION マクロが実行されます。このマクロ関数は、autoconf 用に PHP によって定義された拡張構文でもあります。最初のパラメーターは拡張機能の名前でもあり、2 番目のパラメーターは拡張機能によってコンパイルされる C ファイルです。複数ある場合は、それらを順番に書き留めます。スペースで区切ります); 3 つのパラメータは $ext_shared に固定されます。
次に、php_myext2.h ヘッダー ファイルを作成します。このファイルの名前は、PHP 拡張機能の仕様である php_extension.h です。
#define phpext_myext2_ptr &myext2_module_entry
/* プロトタイプ */
PHP_FUNCTION(こんにちは);
さらに、拡張バージョン番号と関数プロトタイプを識別するマクロも定義しました (PHP_FUNCTION マクロを通じて、PHP_FUNCTION マクロ関数のパラメーターは、後でこの関数を実装します)。
最後に、myext2.c ファイルの実装を見てみましょう:
/* {{{ myext2_functions[]
*
* ユーザーに表示されるすべての関数は、myext2_functions[] にエントリが必要です。
*/
static const zend_function_entry myext2_functions[] = {
PHP_FE(こんにちは、 NULL)
PHP_FE_END
};
/* }}} */
/* {{{ myext2_module_entry
*/
zend_module_entry myext2_module_entry = {
STANDARD_MODULE_HEADER、
"myext2", /* モジュール名 */
myext2_functions, /* モジュール関数 */
NULL, /* モジュールの初期化 */
NULL, /* モジュールのシャットダウン */
NULL, /* 初期化リクエスト */
NULL, /* シャットダウンのリクエスト */
NULL, /* phpinfo */
PHP_MYEXT2_VERSION, /* モジュールのバージョン */
STANDARD_MODULE_PROPERTIES
};
/* }}} */
#ifdef COMPILE_DL_MYEXT2
ZEND_GET_MODULE(myext2)
#endif
/* {{{ proto void hello()
「hello world!」を印刷します。 */
PHP_FUNCTION(こんにちは)
{
php_printf("hello world!n");
}
/* }}} */
展の骨組みを下回って構築された .c ファイルが公開されました。私たちの .c 文書は非常に簡潔であり、これらは最も基本的な展に対して十分に満たされています。
上記のコードは単純で明確であり、大部分の注釈はすでに明らかにされています。1. php.h は必須であり、stdio.h、stdlib.h などの、今後使用するほとんどの標準ファイルが含まれています。
2.myext2_functions は、外部に公開する関数で構成される構造体の数値群を定義し、各要素は PHP_FE 宏によって指定されます。情報 (ここでは単に NULL を使用しています)、最後の要素は PHP_FE_END である必要があります。 注意してください。外部に公開される使用する関数はそれぞれ、この構造体の数値グループ内で定義されている必要があります。 3.myext2_module_entry は私たちのモジュール情報を受け取りました。これは構造体であり、プロパティの大部分がコメントを通じてすでに説明されています。 注意中の 5 つの関数は、私たち全員が単に NULL に設定されており、その後の博覧会でそれぞれの使用法について説明します。 4.ZEND_GET_MODULE(myext2) 関数の数は ifdef に含まれるため、それが使用されるかどうかは状況に応じて決まります。 。
5. 最後に実行コードは hello 関数を実装しましたが、これは非常に単純で、php_printf を使用して hello world! を出力します。
6.注釈の {{{ と }}} は、vim などのブラウザを便利にするために使用されており、注釈もこのように記述しています。
ここでは、PHP_FE、PHP_FE_END、PHP_FUNCTION などのいくつかの宏を対象としていますが、これらの宏を後続のブログに完全に含めることができるため、これらの宏を認識することが最も適切です。
注意我们毪各文件の命名、变量的命名、空格および缩进、および注释等都必常规范的、従順规范、可用我们编写的代コードおよびPHP本体の代コード更加契約,我们推也荐你このような設定を使用して、PHP 展を公開します。
最終、编译运行我们的扩展:
复制代码
代码如下:
$ ./buildconf --force