PHPの実行原理とプロセスをグラフィックコードで詳しく解説

黄舟
リリース: 2023-03-14 20:44:01
オリジナル
3847 人が閲覧しました


はじめに

まず、次のプロセスを見てみましょう:
• PHP 関連のプロセスは手動で開始したことはなく、Apache の起動時に実行されます
• PHP は mod_php5.so モジュールを通じて Apache に接続されます。 ( 具体的には、SAPI (Server Application Programming Interface);
• PHP には、カーネル、Zend エンジン、拡張層の合計 3 つのモジュールがあります。
• PHP コアは、リクエスト、ファイル ストリーム、エラー処理、およびその他の関連操作を処理するために使用されます。
• Zend Engine (ZE) は、ソースファイルをマシン語に変換し、仮想マシン上で実行するために使用されます
• 拡張層は、PHP が特定の操作を実行するために使用する関数、クラスライブラリ、およびストリームのセットです。たとえば、MySQL データベースに接続するには、mysql 拡張機能が必要です。
• ZE がプログラムを実行するとき、いくつかの拡張機能に接続する必要がある場合があります。このとき、ZE は制御を拡張機能に渡し、処理後にそれを返します。特定のタスク;
• 最後に、ZE はプログラムの実行結果を PHP カーネルに返し、PHP カーネルはその結果を SAPI 層に送信し、最終的にブラウザに出力します。
待てよ、そんな単純な話じゃないよ。上記のプロセスは単なる簡略化されたバージョンです。舞台裏で他に何が起こっているのかをもう少し詳しく見てみましょう。
• Apache が起動すると、PHP インタープリタも起動します。
• PHP の起動プロセスには 2 つのステップがあります。
• 最初のステップは、SAPI ライフサイクル全体にわたって有効となるいくつかの環境変数を初期化することです。 2 番目のステップでは、現在のリクエストに対してのみいくつかの変数設定を生成します。

PHP を始めるための最初のステップ

最初のステップと 2 番目のステップが何なのかわからないですか?心配しないでください。これについては次に詳しく説明します。まず、最初の最も重要なステップを見てみましょう。覚えておくべきことは、操作の最初のステップはリクエストが到着する前に行われるということです。

• Apache を起動すると、PHP インタープリターも起動します。

• PHP は、各拡張機能の MINIT メソッドを呼び出して、これらの拡張機能を使用可能な状態に切り替えます。 php.ini ファイルでどのような拡張子が開かれているかを確認してください。
• MINIT は「モジュールの初期化」を意味します。各モジュールは、他のリクエストを処理するための関数、クラス ライブラリなどのセットを定義します。
典型的なMINITメソッドは次のとおりです:

PHP_MINIT_FUNCTION(extension_name){  
/* Initialize functions, classes etc */  }
ログイン後にコピー

PHPが2番目のステップを開始します

• ページリクエストが発生すると、SAPI層は制御をPHP層に渡します。したがって、PHP は、このリクエストに応答するために必要な環境変数を設定します。同時に、実行中に生成された変数名と値を保存する変数テーブルも作成します。

• PHPは各モジュールのRINITメソッド、つまり「リクエストの初期化」を呼び出します。典型的な例は、セッション モジュールの RINIT です。セッション モジュールが php.ini で有効になっている場合、モジュールの RINIT が呼び出されたときに、$_SESSION 変数が初期化され、関連するコンテンツが読み込まれます。メソッドは、プログラムの実行の間に自動的に開始される準備プロセスであると考えることができます。

典型的な RINIT メソッドは次のとおりです:

PHP_RINIT_FUNCTION(extension_name) {  
/* Initialize session variables, pre-populate variables, redefine global variables etc */  }
ログイン後にコピー

PHP シャットダウンの最初のステップ

PHP の起動と同様に、PHP のシャットダウンも 2 つのステップに分かれています:

• ページが実行されると (最後まで実行されるかどうか)ファイルを削除するか、exit または die 関数 abort を使用すると、PHP はクリーンアップ プロセスを開始します。各モジュールの RSHUTDOWN メソッドを順番に呼び出します。

• RSHUTDOWN は、プログラムの実行時に生成されたシンボルテーブルをクリアする、つまり各変数の unset 関数を呼び出すために使用されます。

典型的な RSHUTDOWN メソッドは次のとおりです:

PHP_RSHUTDOWN_FUNCTION(extension_name) {  
/* Do memory management, unset all variables used in the last PHP call etc */  
}
ログイン後にコピー

PHP は 2 番目のステップを閉じます

最後に、すべてのリクエストが処理され、SAPI はシャットダウンする準備が整い、PHP は 2 番目のステップの実行を開始します:

• PHP は拡張された各 MSHUTDOWN を呼び出しますつまり、これは各モジュールがメモリを解放する最後のチャンスです。

典型的な RSHUTDOWN メソッドは次のとおりです:

PHP_MSHUTDOWN_FUNCTION(extension_name) {  
/* Free handlers and persistent memory etc */  }
ログイン後にコピー

このようにして、PHP のライフサイクル全体が終了します。なお、「第1ステップの開始」と「第2ステップの終了」はサーバからのリクエストがない場合のみ実行されます。
以下がイラスト付きでわかる!

PHP の基本的な動作原理

写真からわかるように、PHPは下から上まで4層のシステムです
①Zendエンジン
Zendは純粋なCで実装されており、PHPのコードを翻訳(字句解析、構文解析、その他のコンパイル)します。プロセス ) は、実行可能なオペコードを処理し、対応する処理メソッドを実装し、基本的なデータ構造 (ハッシュテーブル、oo など)、メモリ割り当てと管理を実装し、外部呼び出しに対応する API メソッドを提供するために使用されます。これは、すべてとすべてのペリフェラルの中核です。関数はすべて zend を中心に実装されています。
②拡張機能
拡張機能は、zend エンジンを中心として、コンポーネントベースでさまざまな基本サービスを提供します。一般的なさまざまな組み込み関数 (配列シリーズなど) や標準ライブラリなどもすべて拡張機能を介して実装できます。機能拡張やパフォーマンスの最適化などを実現するために、必要に応じて拡張機能を独自に作成します(たとえば、現在 Tieba で使用されている PHP 中間層やリッチ テキスト解析などが拡張機能の代表的なアプリケーションです)。
③ Sapi
Sapi の正式名は、サーバー アプリケーション プログラミング インターフェイスであり、sapi は、一連のフック関数を通じて php が周辺データと対話できるようにします。これは、php の非常にエレガントで成功した設計です。 sapi により、PHP 自体が上位層のアプリケーションから切り離されて分離されるため、PHP は異なるアプリケーションとの互換性を考慮する必要がなくなり、アプリケーション自体も独自の特性に応じて異なる処理方法を実装できます。これは、後ほどsapiの章で紹介します
④上位層アプリケーション
これは、私たちが通常作成するPHPプログラムです。Webサーバーを介してWebアプリケーションを実装し、スクリプトモードで実行するなど、さまざまなsapiメソッドを通じてさまざまなアプリケーションモードを取得できます。コマンドラインなど

アーキテクチャのアイデア:

エンジン(Zend)+コンポーネント(ext)モデルにより内部結合が軽減
中間層(sapi)がWebサーバーとPHPを分離
************ ** *********************************************** ***
php が車なら、
車のフレームは php そのものです
Zend は車のエンジンです
Ext の下にあるさまざまなコンポーネントは車の車輪です
Sapi は、道路、そして車はさまざまなタイプの道路を走ることができます
そして、php プログラムの実行により、車は道路を走ります。
したがって、必要なもの:優れたパフォーマンスのエンジン + 適切なホイール + 正しい滑走路

Apache と php の関係

Apache による php の解析は、多くのモジュールの中の php モジュールを通じて完了します。

PHPの実行原理とプロセスをグラフィックコードで詳しく解説

最終的にPHPをApacheシステムに統合するには、Apacheに必要な設定を行う必要があります。ここでは、php の SAPI 動作モード mod_php5 を例に説明します。SAPI の概念については、後で詳しく説明します。
インストールするバージョンが Apache2 と Php5 であると仮定すると、Apache のメイン設定ファイル http.conf を編集し、次の行をそれに追加する必要があります:
Unix/Linux 環境の場合:
LoadModule php5_module modules/mod_php5.so
AddType application /x-httpd-php .php
注: modules/mod_php5.so は、X システム環境における mod_php5.so ファイルのインストール場所です。
Windows環境の場合:
LoadModule php5_module d:/php/php5apache2.dll
AddType application/x-httpd-php .php
注: d:/php/php5apache2.dllは、Windows環境でのphp5apache2.dllファイルのインストール場所。
これら 2 つの設定は、サフィックスとして php を使用して今後受信される URL ユーザー リクエストは、処理のために php5_module モジュール (mod_php5.so/php5apache2.dll) を呼び出す必要があることを Apache サーバーに伝えます。

Apacheのライフサイクル

PHPの実行原理とプロセスをグラフィックコードで詳しく解説

Apacheのリクエスト処理プロセス

PHPの実行原理とプロセスをグラフィックコードで詳しく解説

Apache リクエスト処理サイクルの詳細説明

Apache リクエスト処理サイクルの 11 段階では何​​が行われるのですか?
1. Post-Read-Requestステージ
通常のリクエスト処理プロセスにおいて、これはモジュールがフックを挿入できる最初のステージです。この段階は、リクエストの処理を非常に早い段階で開始したいモジュールによって悪用される可能性があります。
2. URI 変換フェーズ
このフェーズにおける Apache の主な作業は、要求された URL をローカル ファイル システムにマッピングすることです。モジュールはこの段階でフックを挿入して、独自のマッピング ロジックを実行できます。 mod_alias はこのフェーズを使用して動作します。
3. ヘッダー解析ステージ
このステージにおける Apache の主な作業: リクエストのヘッダーをチェックします。モジュールはリクエスト処理フローのどの時点でもリクエスト ヘッダーをチェックするタスクを実行できるため、このフックが使用されることはほとんどありません。 mod_setenvif はこのフェーズを使用して動作します。
4. アクセス制御フェーズ
このフェーズにおける Apache の主な作業: 設定ファイルに従って、要求されたリソースへのアクセスが許可されているかどうかを確認します。 Apache の標準ロジックは、許可ディレクティブと拒否ディレクティブを実装します。 mod_authz_host はこのフェーズを使用して動作します。
5. 認証段階
この段階での Apache の主な作業は、設定ファイルに設定されたポリシーに従ってユーザーを認証し、ユーザー名領域を設定することです。モジュールはこの段階でフックを挿入して、認証方法を実装できます。
6. 認可フェーズ
このフェーズにおける Apache の主な作業: 認証されたユーザーが、設定ファイルに従って要求された操作の実行を許可されているかどうかを確認します。モジュールはこの段階でフックを挿入して、ユーザー権限管理メソッドを実装できます。
7. MIME タイプ チェック フェーズ
このステージにおける Apache の主な作業: 要求されたリソースの MIME タイプの関連ルールに基づいて、使用するコンテンツ処理機能を決定します。標準モジュール mod_negotiation および mod_mime はこのフックを実装します。
8. FixUpステージ
これは、モジュールがコンテンツジェネレーターの前に必要な処理を実行できるようにする一般的なステージです。 Post_Read_Request と同様に、これはあらゆる情報を取得できるフックであり、最も一般的に使用されるフックでもあります。
9. 応答ステージ
このステージにおける Apache の主な仕事は、クライアントに返されるコンテンツを生成し、クライアントに適切な応答を送信する責任を負います。この段階はプロセス全体の中核部分です。
10. ロギングフェーズ
このフェーズにおける Apache の主な作業は、クライアントに応答が送信された後のトランザクションを記録することです。モジュールは、Apache の標準ログを変更または置き換えることができます。
11. CleanUpフェーズ
このステージにおけるApacheの主な作業:ファイルやディレクトリの処理やソケットのクローズなど、このリクエストトランザクションの完了後に残された環境をクリーンアップします。 Apacheのリクエスト処理。

LAMPアーキテクチャ

PHPの実行原理とプロセスをグラフィックコードで詳しく解説

下から上へ4つの層:
①liunxはオペレーティングシステムの最下層に属します
②セカンダリサーバーに属するapacheサーバーはLinuxやPHPと通信します
③php:に属しますサーバーサイドプログラミング言語であり、php_moduleモジュールを介してapacheに関連付けられています
④mysqlとその他のWebサービス:アプリケーションサービスに属し、PHPの拡張プラグインモジュールを介してmysqlに関連付けられています

以上がPHPの実行原理とプロセスをグラフィックコードで詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!