これまで PHP について多くのことを学びました。その構成とライフサイクルを完全に理解できたでしょうか。そうでない場合は、この記事に従って学習を続けてください。
1. PHP オープンソースのソース コードのダウンロード アドレス:
2. PHP の構成
1. ディレクトリ構造 2. ディレクトリ分析(1) sapi directory は、PHP のアプリケーション インターフェイス層です。 (2) Main は PHP のメイン コードであり、主に入出力、Web 通信、PHP フレームワークの初期化操作など (fastcgi プロトコルの解析、拡張機能の読み込み、PHP 構成の解析、その他のタスクなど) . ここで完了です。 (3) Zend ディレクトリは、PHP パーサーの主要な実装、つまり PHP 言語のコア実装である ZendVM であり、PHP コードの解釈と実行は Zend によって行われます。 (4) extディレクトリはPHPの拡張ディレクトリです。PHPのcurl拡張機能、gdライブラリ拡張機能、pdo拡張機能などがすべてここにあります。 (5) TSRM ディレクトリは、スレッド セーフに関連する実装です。 (6) PHP のさまざまなコンポーネント間の関係図:
3、SAPI
(1) PHP は、スクリプトの解析と実行を提供するスクリプト パーサーです。入力は通常のテキストであり、事前定義された文法規則に従って PHP パーサーによって解析および実行されます。このパーサーは、コマンド ライン、Web 環境、他のアプリケーションへの埋め込みなど、さまざまな環境に適用できます。この目的のために、PHP はさまざまなアプリケーション環境に適応するための SAPI レイヤーを提供しており、SAPI は PHP のホスト環境と考えることができます。 (2) SAPI は PHP フレームワーク全体の最も外側の部分でもあり、主に PHP フレームワークの初期化を担当します。 SAPI コードは、PHP ソース コードの /sapi ディレクトリにあり、頻繁に使用される 2 つの SAPI は、Cli と Fpm です。4. ZendVM
(1) ZendVM は PHP アプリケーションと実際のコンピュータの間にある仮想コンピュータであり、記述した PHP コードは実装されたコンピュータによって解釈されます。 ZendVM は PHP 言語のコア実装であり、主にコンパイラとエグゼキュータの 2 つの部分で構成されます。 (2) コンパイラは PHP を実行プログラムが認識できる命令に解釈する責任を負い、実行プログラムはコンパイラによって解釈された命令を実行する責任を負います。 (3) ZendVM の役割は Java の JVM に相当し、どちらも抽象的な仮想コンピュータです。5. 拡張機能
(1) 拡張機能は、PHP の機能を拡張するために PHP カーネルによって提供されるメソッドのセットです。これらの拡張機能を使用すると、PHP に多数の実用的な機能が提供され、PHP の操作機能の多くは拡張機能によって提供されます。 (2) 拡張により、C/C を使用して、より強力な機能とより高いパフォーマンスを実現できます。拡張機能は PHP 拡張機能と Zend 拡張機能に分けられます。PHP 拡張機能の方が一般的ですが、Zend 拡張機能は主に ZendVM で使用されます。よく知られている Opcache は Zend 拡張機能です。 3. PHP のライフ サイクル1. PHP のライフ サイクル全体は次の段階に分かれています: (1) モジュールの初期化段階(モジュール起動) (2) リクエスト初期化フェーズ (リクエスト起動) (3) スクリプト実行フェーズ (スクリプト実行) (4) リクエスト終了フェーズ (リクエストshutdown) (5) モジュール シャットダウン フェーズ (モジュール シャットダウン) 注: 異なる SAPI 実装に応じて、各ステージの実行にはいくつかの違いがあります。モードでは、スクリプトを実行するたびにこれらの段階が実行されます。 FastCgi モードでは、起動時にモジュールの初期化が 1 回実行され、その後、各リクエストはリクエストの初期化、スクリプトの実行、およびリクエストの終了ステージのみを通過します。SAPI が閉じている場合は、モジュールの終了ステージのみが通過します。 2. モジュール初期化フェーズ - 分析 (1) このフェーズでは主に PHP フレームワークと Zend エンジンの初期化操作を実行します。この段階のエントリ関数は php_module_startup() です。このステージは通常、SAPI の起動時に 1 回だけ実行されますが、Fpm の場合は、Fpm のマスター プロセスの起動時に実行されます。 (2) この段階のいくつかの主なプロセスは次のとおりです。 (3) SAPI のアクティブ化: sapi_activate()、リクエスト情報 SG (request_info) の初期化、POST リクエストを読み取るためのハンドルの設定、など。 (4) PHP 出力を開始します: php_output_startup()(5) ガベージ コレクターを初期化します: gc_globals_ctor()、zend_gc_globals メモリを割り当てます。 (6) Zend エンジンを開始します: zend_startup()。主な操作は次のとおりです。 (6.1) メモリ プールを開始します start_memory_manager()(6.2) zend_error_cb、zend_pringf、zend_write などのいくつかの util 関数ハンドルを設定します。
(6.3) Zend 仮想マシンのコンパイル、実行関数ハンドル zend_compile_file、zend_execute_ex、ガベージ コレクション関数ハンドル gc_collect_cycles
(6.4) 関数シンボル テーブル、メソッド シンボル テーブル (function_table)、クラス シンボルの割り当てを設定します。テーブル(class_table)、定数シンボルテーブル(zend_constants)など、マルチスレッドの場合はコンパイラやエグゼキュータのグローバル変数も割り当てられます。
(6.5) Zend コア拡張機能の登録: zend_startup_builtin_funtions()、この拡張機能はカーネルによって提供されます。このプロセスは、strlen、define、func_get_args、class_exists などの Zend コア拡張機能によって提供される関数を登録します。
(6.6) Zend によって定義された標準定数を登録します: zend_register_standard_constants() (E_ERROR、E_WARNING、E_ALL、TRUE、FALSE など)。
(6.7) スーパーグローバル変数$GLOBALSの取得ハンドルを登録します。
(6.8) php.iniに設定したストレージシンボルテーブルEG(ini_directives)を配置します。
(7) PHPで定義されている定数:PHP_VERSION、PHP_ZTS、PHP_SAPIなどを登録します。
(8) php.ini の解析: 解析が完了すると、すべての php.ini 設定がconfiguration_hash ハッシュ テーブルに保存されます。
(9) PHP と Zend コアの php.ini 設定のマッピング: 解析された php.ini に基づいて対応する設定値を取得し、最終的な設定を EG (ini_directives) ハッシュ テーブルに挿入します。
(10) $_GET、$_POST、$_COOKIE、$_SERVER、$_ENV、$_REQUEST、$_FILES 変数を取得するためのハンドルを登録します。
(11) 静的にコンパイルされた拡張機能を登録します: php_register_internal_extensions_func()。
(12) 動的にロードされる拡張機能を登録します: php_init_register_extensions()、php.ini で設定された拡張機能を PHP にロードします。
(13) 各拡張機能で定義されたモジュール起動フック関数、つまり PHP_MINIT_FUNCTION() で定義された関数をコールバックします。
(14) php.ini に無効な関数とクラスを登録します: disable_funstions、disable_classes。
3. リクエストの初期化フェーズ - 分析
このフェーズは、すべてのリクエストがリクエストを処理する前に通過するステージです。 fpm の場合、ワーカー プロセスがリクエストを受け入れ、リクエスト データを取得して解析した後の段階です。この段階での処理関数はphp_request_startup()です。
主な処理は次のとおりです。
(1) 出力のアクティブ化: php_output_activate()
(2) Zend エンジンのアクティブ化: zend_activate()、主な操作は
(2.1) ガベージ コレクターのリセット: gc_reset()
(2.2) コンパイラーの初期化: ini_compiler()
(2.3) エグゼキューターの初期化: ini_exexutor()、EG (function_table) と EG(class_table) はそれぞれ CG(function_table) と CG(class_table) を実行します。
(2.4) グローバル変数シンボル テーブル EG (symbol_table)、インクルード ファイル シンボル テーブル EG (include_files) を初期化します。
(2.5) 字句スキャナを初期化します: sapi_activate()
(3) SAPI のアクティブ化: sapi_activate()
(4) リクエスト起動フック関数の拡張定義のコールバック: zend_activate_modules()
4. スクリプト実行フェーズ - 分析
(1) このステージには、PHP コードのコンパイルと実行という 2 つのコア ステージが含まれており、これらは Zend エンジンの最も重要な機能でもあります。
(2) コンパイル段階で、PHP スクリプトは、PHP ソース コードから抽象構文ツリー、そして opline 命令への変換プロセスを経ます。最終的に生成された opline 命令は、認識できる実行命令です。これらの命令はエグゼキュータによって実行され、これは PHP コードの解釈と実行のプロセスです。このステージのエントリ関数は php_execute_script() です。
5. リクエスト終了フェーズ - 分析
(1) このフェーズでは、出力コンテンツのフラッシュ、HTTP 応答ヘッダーの送信、ローカル変数のクリーンアップ、コンパイラーの終了、実行プログラムの終了などが行われます。
(2) また、この段階で各拡張機能のリクエストシャットダウンフック関数がコールバックされます。
(3) このフェーズは、リクエストの初期化フェーズの逆です。
6. モジュール シャットダウン フェーズ - 分析
このフェーズは、SAPI が閉じているときに実行されます。モジュールの初期化フェーズに対応します。主にリソースをクリーンアップし、各 PHP モジュールを閉じます。同時に、各モジュールをコールバックします 拡張モジュールシャットダウンフック関数。
推奨学習: 「PHP ビデオ チュートリアル 」
以上がPHP の構成とライフサイクルは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。