ホームページ  >  記事  >  バックエンド開発  >  PHP 拡張機能の開発 - カーネルの実行プロセスと拡張機能の構造

PHP 拡張機能の開発 - カーネルの実行プロセスと拡張機能の構造

WBOY
WBOYオリジナル
2016-06-23 13:38:41843ブラウズ

拡張機能を開発する前に、PHP カーネルの実行プロセスを理解することが最善です。 PHP には、大まかに次の 3 つの側面が含まれています。

SAPI
Zend VM
内部拡張機能

  • Zend VM は、PHP の仮想マシンであり、 JVM: それぞれの言語のコンパイル/実行コア。まず、それぞれのコードを中間コードにコンパイルします。PHP は通常オペコードと呼ばれ、Java は通常バイトコードと呼ばれます。違いは、PHP のオペコードが Zend VM の実行ユニットによって呼び出される対応する C 関数によって直接実行されることです。表示も保持もできませんが (キャッシュに保持できます)、通常は Java がクラス ファイルを生成して保持します。そしてこれがPHPインタープリターの名前の由来でもあるのかもしれません。実際、C/C++ などの比較的厳密なコンパイル言語と比較して、PHP と Java は、より多くのコンパイルおよびインタープリタ スタイルを組み合わせています。
  • SAPI は、PHP コード サービスのコンパイル/実行を外部に提供するための Zend VM のメソッドおよび仕様とみなすことができます。 cli/cgi/fastcgi/apache_mod として他のプログラムと対話する場合でも、C/C++ などの他の言語に埋め込まれる場合でも、SAPI の仕様を通じて実装できます。その重要なデータ構造の 1 つは、sapi_module_struct (main/SAPI.h 行 217) です
  • 内部拡張部分は Zend VM および SAPI 上に構築されたライブラリとみなすことができ、PHP 開発者にパフォーマンスと使いやすさを保証します。 Java のさまざまなパッケージや Python のさまざまなモジュールにも同様の機能があります。違いは、PHP ではパフォーマンスのために C 拡張機能が使用されることですが、Python では _socket や _select (詳細なパス) などを使用して実現できます。再利用) はネイティブ Python 実装ではありません。
  • ライフサイクル

    さまざまなSAPIまたはPHP自体のライフサイクルに関しては、後で詳しく説明するApacheなどの他のコンポーネントと結合される場合があります。 PHP 拡張機能のライフサイクルについては、次の図を参照してください。このプロセスについてはネット上にたくさんの情報があるので、詳細は説明しません。拡張機能を開発するときに注意する必要があるいくつかの点も、図内の特定のノードに対応する可能性があります:

    グローバル変数の定義 (通常は zend_modulename_globals )
    resource/classes/constants/ などのモジュールレベルの初期化を含む、モジュールの初期化ini 構成
    リクエストの初期化 (単一のリクエストに関連する一部の初期化を含む)
    リクエストの終了、単一のリクエストに関連するデータ/メモリをクリーンアップする
    モジュールのアンインストール、モジュールに関連するデータ/メモリをクリーンアップする

    基本的に私たちがしなければならないことは、上記のプロセスに従い、関連する組み込み関数を実装し、独自のリソース/グローバル変数/クラス/関数などを定義することです。 Python などの他の言語を埋め込んだり、Apache などの他のコンポーネントに埋め込んだりする場合は、マルチプロセスとマルチスレッドに関連する問題に注意してください。

    PHP 拡張構造

    php-src/ext/ext_skel を使用して PHP 拡張フレームワークを生成します

    ./ext_skel --extname=myext[tan@tan ~/software/needbak/php-5.5.20/ext 12:24]$==> ls myext/config.m4  config.w32  CREDITS  EXPERIMENTAL  myext.c  myext.php  php_myext.h  tests

    より重要なファイルは config.m4 (そしてもちろんソース コード) です。config.m4 ファイルは次のコマンドを使用して生成できます。 phpize コマンドを使用してconfigureファイルを設定します。このファイルは、モジュールと外部依存ライブラリを有効にするかどうかを説明します。

    れーれー れーれー
    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。