ホームページ >バックエンド開発 >PHPチュートリアル >PHPの実行原理とプロセスの詳細な説明
この記事の内容は、PHP の実行原理とプロセスの詳細な説明に関するものであり、必要な友人に参考にしていただけます。
• PHP は、mod_php5.so モジュール (具体的には、サーバー アプリケーション プログラミング インターフェイス) を介して Apache に接続されます。 );
• PHP には、カーネル、Zend エンジン、拡張層の合計 3 つのモジュールがあります。
• 拡張層は、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 */ }
1
2
3
PHPが第2ステップを開始します
典型的な RINIT メソッドは次のとおりです:
PHP_RINIT_FUNCTION(extension_name) { /* Initialize session variables, pre-populate variables, redefine global variables etc */ }
2
如同PHP启动一样,PHP的关闭也分两步:
• 一旦页面执行完毕(无论是执行到了文件末尾还是用exit或die函数中止),PHP就会启动清理程序。它会按顺序调用各个模块的RSHUTDOWN方法。
• RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。
一个典型的RSHUTDOWN方法如下:
PHP_RSHUTDOWN_FUNCTION(extension_name) { /* Do memory management, unset all variables used in the last PHP call etc */ }
1
2
3
最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执行第二步:
• PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。
一个典型的RSHUTDOWN方法如下:
PHP_MSHUTDOWN_FUNCTION(extension_name) { /* Free handlers and persistent memory etc */ }
1
2
3
这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。
下面的是用一些图示来说明的!
从图上可以看出,php从下到上是一个4层体系
①Zend引擎
Zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend实现。
②Extensions
围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析就是extension的典型应用)。
③Sapi
Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。后面将在sapi章节中介绍
④上层应用
这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。
エンジン(Zend) + コンポーネント(ext)モデルにより内部結合が軽減される
中間層(sapi)がWebサーバーとphpを分離する
************** ** ***********************************************
phpを車だとすると、
車の骨格はphpそのもの
Zendは車のエンジン(エンジン)
Ext以下の各種コンポーネントは車の車輪
Sapiは道路とみなせる、そして車はさまざまな種類の道路で走ることができます 道路上
そして、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 リクエスト処理サイクルの 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のリクエスト処理。
下から上へ4つの層:
①liunxはオペレーティングシステムの最下層に属します
②apacheサーバーはセカンダリサーバーに属し、LinuxやPHPと通信します
③php:に属しますサーバーサイドプログラミング言語であり、php_moduleモジュールを通じてApacheに関連付けられています
④mysqlとその他のWebサービス:アプリケーションサービスに属し、PHPの拡張プラグインモジュールを通じてmysqlに関連付けられています
関連する推奨事項:
以上がPHPの実行原理とプロセスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。