1. PHP ソース コード構造
PHP には 2 つのカーネル サブシステム、ZE (Zend Engine) があり、
ZE は PHP スクリプトをマシン コード (トークンとも呼ばれます) に解析し、プロセス空間コードでこれらのマシンを実行します。 ZE は、メモリ管理、変数スコープ管理、PHP 関数のスケジュール管理も担当します。
PHP コアは、SAPI 層との通信を担当します。PHP コアは、safe_mode および open_basedir チェック用の統合制御層も提供します。また、PHP コアは、ユーザー ドメインでのファイルおよびネットワーク IO 操作用のストリーム層も提供します。このうち、SAPI (Server Application Programming Interface) には通常、Nginx、Apache、IIS、CLI、CGI などのホスト環境が含まれます。
PHP 拡張機能は、mysql、redis、memcache、sqlite などの読み取りと書き込み、json、xml ファイル、soap、sokcet、curl の解析など、ZE および PHP コアに基づいたさまざまな一般的な操作のカプセル化を提供します。ネットワーク プロトコルのカプセル化、カプセル化暗号化、復号化、圧縮伸長などの処理、画像処理のカプセル化など。一部の拡張機能は、C を使用して Redis 通信プロトコルに従って Redis と通信するなど、特定の機能を最初から実装します。また、一部の拡張機能は、システムにインストールする必要がある画像処理用の gb 拡張機能など、システム内の既存のライブラリを呼び出します。対応する gd ライブラリ自体。
78 の拡張機能が PHP ソース コード php-5.6.24/ext で提供されています。
つまり、ZEとPHP Coreは基本アーキテクチャを提供し、EXT(拡張機能)はユーザードメインでのさまざまな操作を提供します。
php-5.6.24 ソースコードを例にとると、ZE はフォルダー php-5.6.24/Zend に対応し、PHP コアはフォルダー php-5.6.24/main に対応し、拡張機能はフォルダー php-5.6 に対応します。 .24/内線
2. PHP 拡張機能のライフサイクル
PHP は、SAPI コマンドを受け取ると、最初にカーネル サブシステムを初期化し、起動します。カーネル サブシステムの起動の最後に、PHP は拡張コードのロードと拡張機能の初期化を開始します。 , このとき、PHPは各モジュールの初期化ルーチンであるモジュール初期化ルーチン(MINIT)を呼び出します。
MINIT (モジュールの初期化)
PHP は MINIT 関連のルーチンを呼び出し、各拡張機能に内部変数の初期化、リソースの割り当て、リソース処理ハンドルの登録、および独自の関数の ZE への登録を行う機会を与えます。これにより、スクリプトがこれらの関数を呼び出すときに ZE がそれを認識できるようになります。どのコードを実行するか
RINIT (リクエストの初期化)
モジュールの初期化が完了した後、PHP は SAPI からのリクエストを待ちます。 SAPI リクエストが受信されると、ZE は現在リクエストされている PHP スクリプトの実行環境を作成し、それぞれの拡張されたスクリプトを呼び出します。要求初期化 (RINIT) 関数は、各拡張機能に、特定の環境変数を設定したり、要求に基づいてリソースを割り当てたり、監査などの他のタスクを実行したりする機会を与えます。
ここで説明する SAPI リクエストは 2 つのカテゴリに分類されます。1 つは Apache、IIS、およびその他の成熟した Web サーバー SAPI であり、それらが開始されると、PHP は最初に MINIT を実行し、次にユーザーからのページリクエストを待ちます。受信したら、RINIT を実行します。別のタイプの SAPI リクエストは CGI または CLI SAPI です。PHP は、このタイプの SAPI リクエストを受信すると、MINIT の実行後すぐに RINIT を実行します。
RINIT リクエストが初期化された後、ZE は制御を取り戻し、現在リクエストされているスクリプトをトークンに変換します。これは、オペコードの実行中に、オペコードが拡張機能の実行を必要とする場合、最終的にオペコード (オペレーション コード) を形成します。 ZE は、関連するパラメーターを変更された関数にバインドし、関数が実行されるまで一時的に制御を関数に渡して実行します。
RSHUTDOWN (リクエストシャットダウン)
PHP スクリプトが終了すると、PHP は各拡張機能のリクエストシャットダウン (RSHUTDOWN) 関数を呼び出して、最終的なクリーンアップ作業 (セッション変数のディスクへの保存など) を実行します。次に、ZE はクリーンアップ プロセス (ガベージ コレクション) を実行し、前のリクエストで使用されたすべての変数を効果的に unset() します。
MSHUTDOWN (モジュールシャットダウン)
RSHUTDOWN が完了すると、PHP は SAPI からの他のドキュメント要求またはシャットダウン信号を待ち続けます。 CGI や CLI などの SAPI の場合、「次のリクエスト」がないため、SAPI はすぐにシャットダウンを開始します。シャットダウン中、PHP は各拡張機能を再度繰り返し、モジュール シャットダウン (MSHUTDOWN) 関数を呼び出し、最終的に独自のカーネル サブシステムをシャットダウンします。
GINIT
グローバル変数を初期化
GSHUTDOWN
グローバル変数を解放
MINFO
phpinfoモジュールの情報を設定し、phpinfoは各拡張機能の設定情報を平準化する必要があります
// main/php.h #define PHP_MINIT ZEND_MODULE_STARTUP_N #define PHP_MSHUTDOWN ZEND_MODULE_SHUTDOWN_N #define PHP_RINIT ZEND_MODULE_ACTIVATE_N #define PHP_RSHUTDOWN ZEND_MODULE_DEACTIVATE_N #define PHP_MINFO ZEND_MODULE_INFO_N #define PHP_GINIT ZEND_GINIT #define PHP_GSHUTDOWN ZEND_GSHUTDOWN #define PHP_MINIT_FUNCTION ZEND_MODULE_STARTUP_D #define PHP_MSHUTDOWN_FUNCTION ZEND_MODULE_SHUTDOWN_D #define PHP_RINIT_FUNCTION ZEND_MODULE_ACTIVATE_D #define PHP_RSHUTDOWN_FUNCTION ZEND_MODULE_DEACTIVATE_D #define PHP_MINFO_FUNCTION ZEND_MODULE_INFO_D #define PHP_GINIT_FUNCTION ZEND_GINIT_FUNCTION #define PHP_GSHUTDOWN_FUNCTION ZEND_GSHUTDOWN_FUNCTION
3. PHP拡張機能のメモリ管理
実行中の ZE 独自の内部メモリ管理中に、追加のフラグを使用して、特定のメモリ変数が永続メモリであるかどうかを識別します。ただし、拡張機能内で非永続メモリを自分でクリーンアップすることをお勧めします。拡張機能によって要求された非永続メモリは長期間リサイクルされずに残り、それに関連するリソースは長期間解放されないためです。 。