ホームページ  >  記事  >  バックエンド開発  >  PHP 拡張機能開発入門チュートリアル、PHP 拡張機能入門チュートリアル_PHP チュートリアル

PHP 拡張機能開発入門チュートリアル、PHP 拡張機能入門チュートリアル_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:06:11800ブラウズ

PHP拡張機能開発入門チュートリアル、PHP拡張機能入門チュートリアル

PHP拡張機能の開発

私は、この一連のブログ投稿で PHP 拡張機能の開発について学んだことと洞察を要約し、Linux システムで PHP 拡張機能を開発するために知っておくべき最も基本的な知識を簡単かつ明確に説明するつもりです。レベルが低いので間違いがあるかもしれませんがご指摘ください。

準備

まず、PHP ソース コードのコピーを取得し (Github からチェックアウトするか、公式 Web サイトから最新の安定バージョンをダウンロードできます)、コンパイルします。コンパイルを高速化するには、余分な拡張機能をすべて無効にすること (--disable-all オプションを使用) をお勧めしますが、デバッグ (--enable-debug オプションを使用) とスレッド セーフ (--enable-maintainer を使用) をオンにすることをお勧めします。 -zts)、ただし、拡張機能を公開するときにデバッグをオフにし、状況に応じてスレッド セーフをオンにするかどうかを選択する必要があります:

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

$ ./buildconf --force
$ ./configure --disable-all --enable-debug --enable-maintainer-zts
$メイク

--prefix オプション (または make install) は必須ではないため、指定しなかったことに注意してください。 PHP を正常にコンパイルするには、いくつかの依存関係パッケージをインストールする必要がある場合がありますので、出力情報に注意してください。

コンパイルされた PHP 実行可能プログラムは、ソース コードの sapi ディレクトリにあります。将来的には、主に cli (コマンド ライン インターフェイス) 環境を使用することになります。 :

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

$ alias php-dev=/usr/local/src/php-5.6.5/sapi/cli/php

便利なコマンドライン オプションがいくつかあります:

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

php-dev -h # ヘルプ情報を出力します
php-dev -v # バージョン情報を出力します
php-dev --ini #設定情報を出力する
php-dev -m #ロードされたモジュール情報を出力します
php-dev -i # phpinfo
php-dev -r #コード内でコードを実行します

拡張スケルトン

PHP のすべての公式拡張機能はソース コードの ext ディレクトリにあり、独自の拡張機能もこのディレクトリに配置できます。このディレクトリには、PHP 拡張機能のスケルトンを生成するために使用される ext_skel という名前のシェル スクリプトがあることに注意してください。このスクリプトを使用すると、PHP 拡張機能をすばやく作成できます。

コードをコピーします コードは次のとおりです:
$ ./ext_skel --extname=myext

上記のコマンドは、myext という名前の拡張機能を作成するのに役立ちます。ソース コードは myext ディレクトリにあります。パラメーターを指定せずにスクリプトを実行すると、ヘルプ情報が出力され、スクリプトによって提供されるその他のオプションを確認できます。
次に拡張機能を完成させましょう。 myext ディレクトリに入り、config.m4 構成ファイルを編集し、PHP_ARG_ENABLE マクロ関数を見つけて、前の dnl コメント (合計 3 行) を削除します。ソース コードのルート ディレクトリに戻り、buildconf、configure、make コマンドを再実行します。


コードをコピーします コードは次のとおりです:
$ ./buildconf --force
$ ./configure --help grep myext | --enable-myext myext サポートを有効にする
$ ./configure --disable-all --enable-myext --enable-debug --enable-maintainer-zts
$メイク


拡張機能の読み込みステータスを出力するために ./configure --help | grep myext を使用したことに注意してください。以下の出力が表示されない場合は、戻って config.m4 ファイルを確認してください。 。

コードの大部分はすでにコンパイルされているため、このコンパイルは非常に高速になるはずです。 PHP には拡張機能をコンパイルする別の方法 (拡張機能を .so ファイルにコンパイルする動的リンクを使用する) がありますが、拡張機能を開発する場合は静的コンパイルを使用することをお勧めします。これにより、構成ファイルに拡張機能をロードする必要がなくなるためです。

すべてがうまくいけば、最初の拡張機能を実行する準備が整います:


コードをコピーします コードは次のとおりです:
$ php-dev -m grep myext
私の次
$ php-dev -r 'echoconfirm_myext_compiled("myext") "n";'
おめでとうございます! ext/myext/config.m4 が正常に変更されました。モジュール myext が PHP にコンパイルされました。

最初のコマンドは、拡張機能がロードされたことを示しています。 2 番目のコマンドは、ext_skel 拡張スケルトンによって自動的に作成された関数を実行します。もちろん、この関数には意味はありませんが、この関数を hello world に簡単に適用できます。

拡張機能を手動で作成する

ほとんどのチュートリアルでは、ext_skel 拡張スケルトンをプロトタイプとして使用して、拡張機能の開発を説明します。もちろん、このアプローチは非常に便利で高速です。しかし、私は個人的には拡張機能を純粋に手作業で開発することを好みます。なぜなら、あらゆる詳細を理解するのが簡単だからです。

拡張機能を手動で作成するには、まず ext ディレクトリに入り、拡張機能ディレクトリ myext2 を作成します。いくつかのファイルが必要です: config.m4、myext2.c、php_myext2.h。

まず、構成ファイル config.m4 を書きましょう:

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

PHP_ARG_ENABLE(myext2, myext2 サポートを有効にするかどうか,
[ --enable-myext2 myext2 サポートを有効にする])

if テスト "PHP_MYEXT2" != "no" then
PHP_NEW_EXTENSION(myext2, myext2.c, $ext_shared)
ふぃ


config.m4 は、実際には autoconf プログラムによって使用される構成ファイルです。Autoconf は autotools ツールボックスの重要なコンポーネントです。 autoconf の使用法を完全に紹介するには長い時間がかかりますが、幸いなことに、ここでの使用法は非常に簡単です。

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 です。

コードをコピーします コードは次のとおりです:
#ifndef PHP_MYEXT2_H
#PHP_MYEXT2_H を定義します
extern zend_module_entry myext2_module_entry;

#define phpext_myext2_ptr &myext2_module_entry

#define PHP_MYEXT2_VERSION "0.1.0"

/* プロトタイプ */

PHP_FUNCTION(こんにちは);

#endif /* PHP_MYEXT2_H */


ここでのメインコードは、phpext_myext2_ptr という名前のマクロを定義することです。PHP の最下層は、このマクロを通じて拡張機能を参照します。このマクロの名前も標準化されていることがわかります - phpext_extension_ptr。 Myext2_module_entry は、後で .c ファイル内で定義する構造体であり、その名前も標準化されています (extension _module_entry)。

さらに、拡張バージョン番号と関数プロトタイプを識別するマクロも定義しました (PHP_FUNCTION マクロを通じて、PHP_FUNCTION マクロ関数のパラメーターは、後でこの関数を実装します)。

最後に、myext2.c ファイルの実装を見てみましょう:


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

#include "php.h"
#include "php_myext2.h"

/* {{{ 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

$ ./configure --help | grep myext2   --enable-myext2 myext2 サポートを有効にする $ ./configure --disable-all --enable-myext2 --enable-debug --enable-maintainer-zts $メイク
$ php-dev -m | grep myext2
myext2
$ php-dev -r 'hello();'
ハローワールド!

www.bkjia.com本当http://www.bkjia.com/PHPjc/960703.html技術記事 PHP 拡張機能開発入門チュートリアル、PHP 拡張機能入門チュートリアル PHP 拡張機能開発 この一連のブログ投稿では、PHP 拡張機能開発についての学習と洞察を要約し、L で簡単かつ明確に説明しようとしています...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。