概要と紹介
PHP は現在広く使用されている言語で、海外の Facebook や Twitter から国内の Taobao、Tencent、Baidu まで、あらゆる大中小規模の Web サイトで見ることができます。インターネット。 PHP の成功は、そのオープンな拡張 API メカニズムと豊富な拡張コンポーネント (PHP 拡張) に大きく依存していると言えます。PHP がさまざまなデータベース操作から XML、JSON、暗号化、ファイル処理までを実行できるようにするのは、これらの拡張コンポーネントです。グラフィックス処理やSocketなどの分野で万能です。場合によっては、開発者が独自の PHP 拡張機能を開発する必要がある場合があります。PHP5 の現在の拡張機能メカニズムは、豊富なインターフェイスとマクロ定義に加えて、いくつかの実用的なツールを提供するため、PHP 拡張機能の開発はそれほど難しくありません。この記事では、PHP 拡張機能コンポーネントの開発に関する基本的な知識を紹介し、例を通じて PHP 拡張機能を開発する基本プロセスを示します。
PHP 拡張コンポーネントの開発プロセスは Unix 環境と Windows 環境では異なりますが、基本的には相互運用可能です。この記事は Unix 環境 (特に Linux を使用) に基づいて説明します。この記事を読むには、Unix 環境についての簡単な理解、PHP および C 言語の基本的な知識が必要です。簡単な理解がある限り、オペレーティング システムと言語の特殊な機能については触れず、必要に応じて説明します。読者の読みを容易にします。
この記事の具体的な開発環境は、Ubuntu 10.04 + PHP 5.3.3です。
PHP ソース コードをダウンロードする
PHP 拡張機能を開発するには、最初のステップとして PHP ソース コードをダウンロードします。これには、拡張機能の開発に必要なツールが含まれています。最新バージョンの PHP 5.3.3 を tar.bz2 圧縮パッケージの形式でダウンロードしました。ダウンロード アドレスは、http://cn.php.net/get/php-5.3.3.tar.bz2/from/a/mirror です。
ダウンロード後、ソースコードを適切なディレクトリに移動して解凍します。解凍コマンドは次のとおりです:
この時点で、ls を使用して再度確認すると、追加の「say_hello」ディレクトリがあることがわかります。このディレクトリに入ると、以下に示すように、ext_skel が Say_hello の基本フレームワークを確立していることがわかります。
PHP 拡張パッケージのディレクトリ構造の内容全体を理解するのが面倒な場合は、その中に注意する必要がある 3 つのファイルがあります:
config.m4: これは Unix 環境のビルド システム構成ファイルであり、後で構成とインストールを生成するために使用されます。
php_say_hello.h: このファイルは拡張モジュールのヘッダー ファイルです。 C 言語の一貫したスタイルに従って、いくつかのカスタム構造体、グローバル変数などをこの中に配置できます。
say_hello.c: これは拡張モジュールのメイン プログラム ファイルです。拡張モジュールの最後の関数エントリがここにあります。もちろん、すべてのプログラム コードをその中に詰め込むこともできますし、モジュールの考え方に従って各機能モジュールを異なるファイルに入れることもできます。
以下のコンテンツは主にこれら 3 つのファイルを中心に展開します。
Unix ビルドシステム構成
Build System の設定については、Unix システムの多くのことに関連しているので、詳しく書くことができますが、私が興味を持って書いても、誰もが読むことに興味がないと思われるので、ここでは省略し、重要なポイントのみに焦点を当てます。config.m4 の詳細については、こちらを参照してください。
生成された config.m4 ファイルを開きます。内容はおおよそ次のとおりです:
7 番目のフィールド「name」、このフィールドはこの PHP 拡張機能の名前であり、この例では「say_hello」になります。 8 番目のフィールド「functions」は、この拡張で指定された関数の参照を保存します。特定の構造は再分析されません。興味のある友人は、対応するコードをここに書き込むことができます。宏。
第 9 から 12 の文字列はそれぞれ 4 つの関数を指しています。この 4 つの関数はそれぞれ「扩展モジュールの追加時」、「扩展モジュールの卸売時」、「每请要求開始時」および「この 4 つの関数は、主に対応するタイムマシンのリソースの割り当て、解放などの関連動作に使用される一種のメカニズムと見なすことができます。
13 番目のフィールド「info_func」も関数指向の 1 つであり、この指向の関数は phpinfo() の実行時に使用され、独自のモジュール情報を表示するために使用されます。14 番目のフィールド「version」はモジュールのバージョンです。
(zend_module_entry の詳細についてはこちらを参照)以上のフィールドが完了すると、「say_hello.c」内で自動的に生成された「say_hello_module_entry」のフレームコードが表示されます。
*/
zend_module_entry Say_hello_module_entry = {#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,#endif
"say_hello",say_hello_functions,
PHP_MINIT(say_hello),
まず、マクロ「STANDARD_MODULE_HEADER」は最初の6フィールドを生成し、「STANDARD_MODULE_PROPERTIES」は「version」以降のフィールドを生成しますので、まだ心配する必要はありません。私たちが注目するいくつかのフィールドもマクロによって入力または生成されており、いくつかの関数のフレームワークも「say_hello.c」内の対応する場所に生成されています。ここで、いくつかのマクロのパラメータはすべて「say_hello」ですが、これはいくつかの関数の名前がすべて「say_hello」であることを意味するわけではなく、C 言語には関数名のオーバーロード機構がないことに注意してください。実際、PHP 拡張機能の開発プロセスでは、グローバル変数から関数定義、さらには戻り値に至るまで、Zend で事前に定義されたさまざまなマクロがほぼあらゆる場所で使用されます。 PHP のメカニズムは名前の競合などの問題を引き起こす可能性があり、これらのマクロは関数などの要素を内部名に変換しますが、これらはプログラマにとっては透過的です (マクロのコードを読まない限り)。私たちはさまざまなマクロやマクロを通じてプログラムします。私たちのために内部の多くのことを処理してください。
ここに書くと、私たちのタスクは明確です: まず、対応する時間に何かを処理する必要がある場合は、各インターセプト関数の内容を入力する必要があります。次に、say_hello の関数関数を記述し、say_hello_functions への参照を追加します。
say_hello 拡張機能はライフサイクルの各段階での操作を必要としないため、info_func の内容を記述するだけです。上記のように、この関数は拡張機能の情報を表示するために phpinfo() が実行されるときに自動的に呼び出されます。この関数を記述するには 4 つの関数が使用されます:
php_info_print_table_start() - phpinfo テーブルを開始します。パラメータはありません。
php_info_print_table_header()—出力テーブルヘッダー。最初のパラメータはヘッダーの列数を示す整数で、後続のパラメータは表示するテキストを指定するために使用される列数に等しい (char*) タイプのパラメータです。
php_info_print_table_row()—テーブルの内容を出力します。最初のパラメータは、この行の列数を示す整数で、後続のパラメータは、表示するテキストを指定するために使用される列数に等しい (char*) タイプのパラメータです。
php_info_print_table_end() - phpinfo テーブルを終了します。パラメータはありません。