ホームページ >バックエンド開発 >PHPチュートリアル >PHP の原則: PHP の基礎となる動作原理

PHP の原則: PHP の基礎となる動作原理

WBOY
WBOYオリジナル
2016-06-23 14:29:45866ブラウズ

はじめに
まず、次のプロセスを見てみましょう:

PHP 関連のプロセスを手動で開始したことはありません。このプロセスは、Apache の起動時に実行されます。PHP は、mod_php5.so モジュール (具体的には、SAPI) を通じて Apache に接続されます。 、サーバー アプリケーション プログラミング インターフェイス)、PHP にはカーネル、Zend エンジン、拡張層の 3 つのモジュールがあります。PHP カーネルは、リクエスト、ファイル ストリーム、エラー処理、およびその他の関連操作の処理に使用されます。ソース ファイルを機械語に変換し、仮想マシン上で実行します。拡張層は、PHP が特定の操作を実行するために使用する関数、クラス ライブラリ、およびストリームのセットです。たとえば、MySQL データベースに接続するには mysql 拡張機能が必要ですが、ZE がプログラムを実行するときに、いくつかの拡張機能に接続する必要がある場合があります。このとき、ZE は制御を拡張機能に渡し、特定のタスクの処理後に制御を返します。 ; 最後に、ZE はプログラムの実行結果を PHP カーネルに返し、PHP カーネルはその結果を SAPI 層に送信し、最終的にブラウザに出力します。

徹底した議論
待ってください、それはそれほど単純ではありません。上記のプロセスは単なる簡略化されたバージョンです。舞台裏で他に何が起こっているのかをもう少し詳しく見てみましょう。

Apache が開始されると、PHP インタープリターも開始されます。PHP の起動プロセスには 2 つのステップがあります。最初のステップはいくつかの環境変数を初期化することであり、これは SAPI ライフサイクル全体にわたって有効になります。いくつかの変数設定を要求します。

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

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

典型的な MINIT メソッドは次のとおりです:
PHP_MINIT_FUNCTION(extension_name){
/* 関数、クラスなどを初期化します */
}
PHP は 2 番目のステップを開始します

ページリクエストが発生すると、SAPI 層が制御を PHP 層に渡します。したがって、PHP は、このリクエストに応答するために必要な環境変数を設定します。同時に、実行中に生成された変数名と値を保存する変数テーブルも作成します。 PHP は各モジュールの RINIT メソッド、つまり「リクエストの初期化」を呼び出します。典型的な例はセッション モジュールの RINIT です。セッション モジュールが php.ini で有効になっている場合、$_SESSION 変数は初期化され、モジュールの RINIT メソッドが呼び出されたときに関連するコンテンツが読み込まれます。準備プロセスはプログラムの実行の間に自動的に開始されます。

典型的な RINIT メソッドは次のとおりです:
PHP_RINIT_FUNCTION(extension_name) {
/* Initialize session variables, pre-populate variables, redefine global variables etc */
}
PHP シャットダウンの最初のステップ
PHP の起動と同じように、PHP のシャットダウンこれも 2 つのステップです:

ページが実行されると (ファイルの最後に到達するか、exit または die 関数で終了するかに関係なく)、PHP はクリーンアップ プロセスを開始します。各モジュールの RSHUTDOWN メソッドを順番に呼び出します。 RSHUTDOWN は、プログラムの実行中に生成されたシンボル テーブルをクリアする、つまり各変数の unset 関数を呼び出すために使用されます。

典型的な RSHUTDOWN メソッドは次のとおりです:
PHP_RSHUTDOWN_FUNCTION(extension_name) {
/* メモリ管理を行い、最後の PHP 呼び出しで使用されたすべての変数の設定を解除します。etc */
}
PHP は 2 番目のステップを閉じます
最後に、すべてのリクエストが処理されました完了すると、SAPI を閉じる準備も整い、PHP は 2 番目のステップの実行を開始します。

PHP は各拡張機能の MSHUTDOWN メソッドを呼び出します。これは、各モジュールがメモリを解放する最後の機会です。

典型的な RSHUTDOWN メソッドは次のとおりです:
PHP_MSHUTDOWN_FUNCTION(extension_name) {
/* ハンドラーと永続メモリの解放など */
}
このようにして、PHP のライフサイクル全体が終了します。なお、「第1ステップの開始」と「第2ステップの終了」はサーバからのリクエストがない場合のみ実行されます。

以下がイラスト付きでわかる!

PHP の基本的な動作原理

図 1 PHP の構造

写真からわかるように、PHP は下から上まで 4 層のシステムです

①Zend エンジン

Zend は純粋な C で実装されており、 PHP のコア部分。PHP コード (字句解析や構文解析などの一連のコンパイル プロセス) を実行可能なオペコード処理に変換し、対応する処理メソッドを実装し、基本的なデータ構造 (ハッシュテーブル、OO など)、メモリの割り当てと管理を実装します。 API メソッドは外部呼び出し用であり、すべての周辺機能が zend を中心に実装されています。

②拡張機能

拡張機能は、zend エンジンを中心に、コンポーネントベースの方法でさまざまな基本サービスを提供し、一般的なさまざまな組み込み関数 (配列シリーズなど) や標準ライブラリなどをすべて拡張機能を通じて実装できます。必要に応じて拡張機能も使用します。 機能拡張やパフォーマンスの最適化などの目的で独自の拡張機能を実装します (たとえば、現在 Tieba で使用されている PHP 中間層やリッチ テキスト解析が拡張機能の代表的なアプリケーションです)。

③サピ

Sapi の正式名はサーバー アプリケーション プログラミング インターフェイスであり、Sapi によって PHP が一連のフック関数を通じて周辺データと対話できるようになります。これは、PHP 自体が Sapi を介して成功した設計です。 Decoupled に統合され、上位層アプリケーションから分離されると、PHP は異なるアプリケーションとの互換性を考慮する必要がなくなり、アプリケーション自体も独自の特性に基づいて異なる処理方法を実装できます。これは、後ほど sapi の章で紹介します

④上位層アプリケーション

これは、私たちが通常作成する 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

注: Windows 環境の場合、d:/php/php5apache2.dll は php5apache2 です。 dll ファイルの場所。

これら 2 つの構成は、サフィックスとして php を使用して今後受信する URL ユーザー リクエストは、処理のために php5_module モジュール (mod_php5.so/php5apache2.dll) を呼び出す必要があることを Apache サーバーに伝えます。

Apache のライフサイクル

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

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 アーキテクチャ:

下から上へ 4 つの層:

①liunx はオペレーティング システムの最下層に属します

②セカンダリ サーバーで Linux と PHP と通信する Apache サーバー

③php: に属しますphp_module モジュールを介してサーバー側プログラミング言語に接続 Apache に関連付けられます

④mysql およびその他の Web サービス: アプリケーション サービスに属し、PHP の Extensions プラグイン モジュールを介して mysql に関連付けられます

Android システム アーキテクチャ図

Lamp のアーキテクチャ図を比較Android と、ランプのアーキテクチャに似ているようですが、Android についてはわかりません。違いを指摘していただければ幸いです

Android アーキテクチャ --------説明----- ---LAMP アーキテクチャ

1. アプリケーション -------- 具体的なアプリケーション --- ----- Web アプリケーション

2. アプリケーション フレームワーク ---- Java ------- ------PHP 言語とライブラリ

3. システム ランタイム ライブラリ:----仮想マシン- --------WEB サーバー

⒋Linux カーネル: ---オペレーティング システム----- --L ランプ アーキテクチャ

さらに詳しい調査と理解については、以下を参照してください:

Fengyu のブログ http://www.laruence.com/2008/08/12/180.html

Baidu R&D Center のブログ http://stblog.baidu-tech.com/?p=763

Wang Xingbin のブログ http ://blog.csdn.net/wanghao72214/article/details/3916825

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