ホームページ > バックエンド開発 > PHPチュートリアル > PHP 拡張機能の開発に関する簡単な説明 - 基本ページ 1/2_PHP チュートリアル

PHP 拡張機能の開発に関する簡単な説明 - 基本ページ 1/2_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:33:27
オリジナル
920 人が閲覧しました

概要と紹介
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 です。

ダウンロード後、ソースコードを適切なディレクトリに移動して解凍します。解凍コマンドは次のとおりです:

コードをコピーします コードは次のとおりです:
tar -jxvf ソースパッケージ名

tar.gz 圧縮パッケージをダウンロードした場合、解凍コマンドは次のとおりです
コードコードは次のとおりです:
tar -zxvf ソースパッケージ名

解凍後、ソースコードディレクトリ内にextディレクトリが存在します。これはPHP拡張機能に関連するディレクトリです。ディレクトリに入って ls で表示すると、多数の既存の拡張子が表示されます。下の写真は私の環境で閲覧した結果です


image

青いのは拡張パッケージのディレクトリで、おなじみのmysql、iconv、gdなどが入っています。 ext_skel は、Unix 環境で PHP 拡張フレームワークを自動生成するために使用されるスクリプト ツールです。 ext_skel_win32.php は、Windows での対応するスクリプトです。

独自の PHP 拡張機能を開発する - Say_hello
次に、PHP 拡張機能 Say_hello を開発します。この拡張機能は非常に単純で、文字列パラメータを受け入れて「Hello xxx!」を出力するだけです。この例は、PHP 拡張コンポーネントの開発プロセスを紹介するだけであり、実際の機能を想定したものではありません。

拡張コンポーネント フレームワークを生成する
PHP の拡張コンポーネント開発ディレクトリとファイルは固定された構造になっており、既存の拡張コンポーネント ディレクトリに入るだけで、そのすべてのファイルを確認できると思います。もちろん、フレームワークを手動で構築することもできますが、何かに代わって構築してもらいたいと思うでしょう。上記の ext_skel スクリプトは、拡張機能パッケージ フレームワークを自動的に構築するために使用されるツールです。 ext_skel の完全なコマンドは次のとおりです:

ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]] [--skel=dir] [--full- xml ] [--no-help]

初心者として、すべてのコマンド パラメーターを知る必要はありません。実際、ほとんどの場合、最初のパラメーター (拡張モジュールの名前) を指定するだけで済みます。 。したがって、ext ディレクトリに次のコマンドを入力します:
./ext_skel --extname=say_hello

(ext_skel のさまざまなコマンド パラメータについて詳しく知りたい場合は、ここを参照してください)

この時点で、ls を使用して再度確認すると、追加の「say_hello」ディレクトリがあることがわかります。このディレクトリに入ると、以下に示すように、ext_skel が Say_hello の基本フレームワークを確立していることがわかります。

image

PHP 拡張パッケージのディレクトリ構造の内容全体を理解するのが面倒な場合は、その中に注意する必要がある 3 つのファイルがあります:

config.m4: これは Unix 環境のビルド システム構成ファイルであり、後で構成とインストールを生成するために使用されます。

php_say_hello.h: このファイルは拡張モジュールのヘッダー ファイルです。 C 言語の一貫したスタイルに従って、いくつかのカスタム構造体、グローバル変数などをこの中に配置できます。

say_hello.c: これは拡張モジュールのメイン プログラム ファイルです。拡張モジュールの最後の関数エントリがここにあります。もちろん、すべてのプログラム コードをその中に詰め込むこともできますし、モジュールの考え方に従って各機能モジュールを異なるファイルに入れることもできます。

以下のコンテンツは主にこれら 3 つのファイルを中心に展開します。

Unix ビルドシステム構成

PHP 拡張コンポーネントを開発する最初のステップは、実装コードを記述することではなく、まず [Build System] オプションを構成することです。 Linux で開発しているため、ここでの設定は主に config.m4 に関連します。

Build System の設定については、Unix システムの多くのことに関連しているので、詳しく書くことができますが、私が興味を持って書いても、誰もが読むことに興味がないと思われるので、ここでは省略し、重要なポイントのみに焦点を当てます。config.m4 の詳細については、こちらを参照してください。

生成された config.m4 ファイルを開きます。内容はおおよそ次のとおりです:


コードをコピーします コードは次のとおりです:

dnl $Id$
dnl config.m4 (拡張子 Say_hello 用)
dnl このファイル内のコメントは文字列「dnl」で始まります。
dnl 必要に応じて削除します。このファイルは
dnl を編集しないと機能しません。
dnl 拡張機能が外部のものを参照している場合は、次とともに使用します:
dnl PHP_ARG_WITH(say_hello, Say_hello サポートの場合、
dnl コメントが整列していることを確認してください:
dnl [ --with-say_hello Include Say_hello support])
dnl それ以外の場合は、enable を使用します:
dnl PHP_ARG_ENABLE(say_hello、say_hello サポートを有効にするかどうか、
dnl コメントが整列していることを確認してください:
dnl [ --enable-say_hello Say_hello サポートを有効にする])
if test "$PHP_SAY_HELLO" != "no";それから
dnl ここにテストの例をさらに書いてください...
dnl # --with-say_hello -> check with-path
dnl SEARCH_PATH="/usr/local /usr" # これを変更することもできます
dnl SEARCH_FOR="/include/say_hello.h" # この
dnl を変更する可能性が高いです if test -r $ PHP_SAY_HELLO/$SEARCH_FOR; then # パラメータとして指定されたパス
dnl SAY_HELLO_DIR=$PHP_SAY_HELLO
dnl else # デフォルトのパスリストを検索
dnl AC_MSG_CHECKING([デフォルトパスのsay_hello ファイル用])
dnl for i in $SEARCH_PATH ; do
dnl if test -r $i/$SEARCH_FOR; then
dnl SAY_HELLO_DIR=$i
dnl AC_MSG_RESULT($i にあります)
dnl fi
dnl 完了
dnl fi
dnl
dnl if test -z "$SAY_HELLO_DIR";次に
dnl AC_MSG_RESULT([見つかりません])
dnl AC_MSG_ERROR([say_hello ディストリビューションを再インストールしてください])
dnl fi
dnl # --with-say_hello ->インクルード パスを追加
dnl PHP_ADD_INCLUDE($SAY_HELLO_DIR/include)
dnl # --with-say_hello -> lib とシンボルの存在を確認します
dnl LIBNAME=say_hello # これを変更することもできます
dnl LIBSYMBOL=say_hello # おそらくこれを変更する必要があります
dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
dnl [
dnl PHP_ADD_LIBRARY_WITH_PATH($LI) BNAME 、$SAY_HELLO_DIR/lib, SAY_HELLO_SHARED_LIBADD)
dnl AC_DEFINE(HAVE_SAY_HELLOLIB,1,[ ])
dnl ],[
dnl AC_MSG_ERROR([間違ったsay_hello libバージョンまたはlibが見つかりません])
dnl ],[
dnl -L$SAY_HELLO_DIR /lib -lm
dnl ])
dnl
dnl PHP_SUBST(SAY_HELLO_SHARED_LIBADD)
PHP_NEW_EXTENSION(say_hello,say_hello.c, $ext_shared)
fi

これは PHP Extension の原型であるため、明確でない限り、PHP Extension は公開されていません。各フィールドは、このセクションの文章で使用されるフィールドにのみ関連付けられています。これは、フィールドが多く、手作業で書き込む必要がなく、特定の所定のマクロ フィルを使用することができます。

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),

PHP_MSHUTDOWN(say_hello), PHP_RINIT(say_hello), /* 次の場合は NULL に置き換えますリクエスト開始時に何もすることがない */ PHP_RSHUTDOWN(say_hello), /* リクエスト終了時に何もすることがない場合は NULL に置き換える */ PHP_MINFO(say_hello), #if ZEND_MODULE_API_NO >= 20010901
"0.1", / * 拡張機能のバージョン番号に置き換えます */
#endif
STANDARD_MODULE_PROPERTIES
};
/* }}} */


まず、マクロ「STANDARD_MODULE_HEADER」は最初の6フィールドを生成し、「STANDARD_MODULE_PROPERTIES」は「version」以降のフィールドを生成しますので、まだ心配する必要はありません。私たちが注目するいくつかのフィールドもマクロによって入力または生成されており、いくつかの関数のフレームワークも「say_hello.c」内の対応する場所に生成されています。ここで、いくつかのマクロのパラメータはすべて「say_hello」ですが、これはいくつかの関数の名前がす​​べて「say_hello」であることを意味するわけではなく、C 言語には関数名のオーバーロード機構がないことに注意してください。実際、PHP 拡張機能の開発プロセスでは、グローバル変数から関数定義、さらには戻り値に至るまで、Zend で事前に定義されたさまざまなマクロがほぼあらゆる場所で使用されます。 PHP のメカニズムは名前の競合などの問題を引き起こす可能性があり、これらのマクロは関数などの要素を内部名に変換しますが、これらはプログラマにとっては透過的です (マクロのコードを読まない限り)。私たちはさまざまなマクロやマクロを通じてプログラムします。私たちのために内部の多くのことを処理してください。

ここに書くと、私たちのタスクは明確です: まず、対応する時間に何かを処理する必要がある場合は、各インターセプト関数の内容を入力する必要があります。次に、say_hello の関数関数を記述し、say_hello_functions への参照を追加します。

phpinfo()コールバック関数を書く

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 テーブルを終了します。パラメータはありません。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/322589.html技術記事概要、次に dnl ここにテストの例をさらに書いてください... dnl # --with-say_hello - パスでチェック dnl SEARCH_PATH="/usr/local /usr" # この dnl SEARCH_FOR="/incl.. を変更することもできます。 .
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート