はじめに
以下のプロセスを見てみましょう:
PHP 関連のプロセスを手動で開始したことはありません。Apache が開始されると実行されます。
PHP は mod_php5.so モジュール (特に SAPI、サーバー アプリケーション プログラミング インターフェイス) を通じて Apache に接続されます。
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(拡張機能名){
/* 関数、クラスなどを初期化します */
}
PHP起動第二ステップ
ページリクエストが発生すると、SAPI レイヤーは制御を PHP レイヤーに引き渡します。したがって、PHP は、このリクエストに応答するために必要な環境変数を設定します。同時に、実行中に生成された変数名と値を保存する変数テーブルも作成します。
PHP は各モジュールの RINIT メソッド、つまり「リクエストの初期化」を呼び出します。典型的な例はセッション モジュールの RINIT です。セッション モジュールが php.ini で有効になっている場合、$_SESSION 変数は初期化され、モジュールの RINIT が呼び出されたときに関連するコンテンツが読み込まれます。
RINIT メソッドは、プログラムの実行の間に自動的に開始される準備プロセスとみなすことができます。
典型的な RINIT メソッドは次のとおりです:
PHP_RINIT_FUNCTION(拡張機能名) {
/* セッション変数の初期化、変数の事前設定、グローバル変数の再定義など */
}
PHP を閉じるための最初のステップ
PHP の起動と同様に、PHP のシャットダウンも 2 つのステップに分かれています:
ページが実行されると (ファイルの最後に到達するか、exit または die 関数で終了するかに関係なく)、PHP はクリーンアップ プロセスを開始します。各モジュールの RSHUTDOWN メソッドを順番に呼び出します。
RSHUTDOWN は、プログラムの実行中に生成されたシンボル テーブルをクリアする、つまり各変数の unset 関数を呼び出すために使用されます。
一般的な RSHUTDOWN メソッドは次のとおりです:
PHP_RSHUTDOWN_FUNCTION(拡張機能名) {
/* メモリ管理を行い、最後の PHP 呼び出しなどで使用されたすべての変数の設定を解除します */
}
PHP ステップ 2 を閉じる
最後に、すべてのリクエストが処理され、SAPI を閉じる準備が整い、PHP が 2 番目のステップの実行を開始します。
PHP は各拡張機能の MSHUTDOWN メソッドを呼び出します。これが各モジュールがメモリを解放する最後の機会です。
一般的な RSHUTDOWN メソッドは次のとおりです:
PHP_MSHUTDOWN_FUNCTION(拡張機能名) {
/* 空きハンドラーや永続メモリなど */
}
このようにして、PHP のライフサイクル全体が終了します。なお、「第1ステップの開始」と「第2ステップの終了」はサーバからのリクエストがない場合のみ実行されます。
以下にいくつかの図を使って説明します。
PHP の基本的な動作原理
図1 phpの構造
写真からもわかるように、PHPは下から上まで4層構造になっています
①ゼンドエンジン
Zend は完全に純粋な C で実装されており、PHP のコア部分です。PHP コード (字句解析、構文解析、その他のコンパイル プロセス) を実行可能なオペコード処理に変換し、対応する処理メソッドを実装し、基本的なデータ構造 (hashtable、oo など) を実装します。 )、メモリの割り当てと管理、および外部呼び出しに対応する API メソッドの提供がすべての中核であり、すべての周辺機能は zend を中心に実装されています。
②拡張機能
zend エンジンを中心に、拡張機能はコンポーネントベースの方法でさまざまな基本サービスを提供します。一般的なさまざまな組み込み関数 (配列シリーズなど)、標準ライブラリなどはすべて拡張機能を通じて実装されます。機能拡張やパフォーマンスの最適化などを実現するために、必要に応じて拡張機能を追加します(たとえば、現在 Tieba で使用されている PHP 中間層やリッチ テキスト解析などが拡張機能の代表的な用途です)。
③サピ
Sapi の正式名はサーバー アプリケーション プログラミング インターフェイスであり、これは PHP が周辺データと対話できるようにするための一連のフック関数を使用します。 php 自体が Decoupled に統合され、上位層のアプリケーションから分離されることに成功しました。PHP は異なるアプリケーションとの互換性を考慮する必要がなくなり、アプリケーション自体も独自の特性に基づいて異なる処理方法を実装できます。後ほどサピ編で紹介します
④上位層アプリケーション
これは、私たちが通常作成する PHP プログラムです。Web サーバーを介して Web アプリケーションを実装したり、コマンドラインでスクリプト モードで実行したりするなど、さまざまな Sapi メソッドを通じてさまざまなアプリケーション モードを取得できます。
建築のアイデア:
エンジン (Zend) + コンポーネント (ext) モードにより内部カップリングが軽減されます
中間層(sapi)はWebサーバーとphpを分離します
************************************************ ***** *************************
php を車に例えると
車のフレームワークはphpそのもの
Zend は車のエンジンです
Ext の下にあるさまざまなコンポーネントは車の車輪です
サピは道路とみなすことができ、車はさまざまな種類の道路を走行できます
php プログラムの実行は、道路を走る車のようなものです。
したがって、必要なものは、高性能エンジン + 適切なホイール + 適切なトラックです
Apacheとphpの関係
Apache による 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 ライフサイクル
Apachのリクエスト処理プロセス
Apacheリクエスト処理ループの詳しい説明
Apache リクエスト処理サイクルの 11 段階とは何ですか?
通常のリクエスト処理フローでは、これはモジュールがフックを挿入できる最初の段階です。この段階は、リクエストの処理を非常に早い段階で開始したいモジュールによって悪用される可能性があります。
2. URI 変換段階
この段階での Apache の主な仕事は、要求された URL をローカル ファイル システムにマッピングすることです。モジュールはこの段階でフックを挿入して、独自のマッピング ロジックを実行できます。 mod_alias はこのフェーズを使用して動作します。
この段階での Apache の主な仕事は、リクエストのヘッダーをチェックすることです。モジュールはリクエスト処理フローのどの時点でもリクエスト ヘッダーをチェックするタスクを実行できるため、このフックが使用されることはほとんどありません。 mod_setenvif はこのフェーズを使用して動作します。
この段階での Apache の主な作業は、構成ファイルに従って、要求されたリソースへのアクセスが許可されているかどうかを確認することです。 Apache の標準ロジックは、許可ディレクティブと拒否ディレクティブを実装します。 mod_authz_host はこのフェーズを使用して動作します。
この段階での Apache の主な作業は、設定ファイルに設定されたポリシーに従ってユーザーを認証し、ユーザー名領域を設定することです。モジュールはこの段階でフックを挿入して、認証方法を実装できます。
この段階での Apache の主な作業は、認証されたユーザーが構成ファイルに従って要求された操作の実行を許可されているかどうかを確認することです。モジュールはこの段階でフックを挿入して、ユーザー権限管理メソッドを実装できます。
7. MIME タイプチェック段階
この段階での Apache の主な作業は、要求されたリソースの MIME タイプの関連ルールに基づいて、使用するコンテンツ処理機能を決定することです。標準モジュール mod_negotiation および mod_mime はこのフックを実装します。
8. 修正ステージ
これは、モジュールがコンテンツ ジェネレーターの前に必要な処理を実行できるようにする一般的なステージです。 Post_Read_Request と同様に、これはあらゆる情報を取得できるフックであり、最も一般的に使用されるフックでもあります。
9. 対応段階
この段階での Apache の主な仕事は、クライアントに返されるコンテンツを生成し、クライアントに適切な応答を送信する責任を負います。この段階はプロセス全体の中核部分です。
10. ロギングステージ
この段階での Apache の主な仕事は、クライアントに応答が送信された後のトランザクションを記録することです。モジュールは、Apache の標準ログを変更または置き換えることができます。
11.クリーンアップステージ
この段階での Apache の主な作業は、ファイルやディレクトリの処理、ソケットのクローズなど、このリクエスト トランザクションの完了後に残された環境をクリーンアップすることです。これは、Apache のリクエスト処理の最終段階です。
LAMP アーキテクチャ:
下から上までの 4 つのフロア:
①liunxはオペレーティングシステムの最下層に属します
②Apacheサーバー、セカンダリサーバーであり、LinuxとPHPと通信します
③php: サーバーサイドプログラミング言語であり、php_moduleモジュールを通じてApacheに関連付けられています
④mysql およびその他の Web サービス: アプリケーション サービスに属し、PHP の拡張プラグイン モジュールを通じて mysql に関連付けられます
作者: IBMfahsion