ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルの基本的な動作原理から始めましょう

PHP_PHP チュートリアルの基本的な動作原理から始めましょう

WBOY
WBOYオリジナル
2016-07-13 10:28:46877ブラウズ

私は以前に .net と Java の開発を行ったことがあり、いくつかの PHP Web サイトも書いたことがあります。3 つの主要なプログラミング言語すべてに触れてきたようです。しかし、プログラミングプロセス全体、特に基礎となるメカニズムについての全体的な理解が不足していると感じることが増えてきました。たとえば、ネットワーク プログラミング、コンパイルの原則、サーバー側、データベース ストレージ エンジンの原則などです。そこで私はいくつかの本を読みました。古典的なものには、apue、unp、tcp/ip、nginx、mysql の innodb ストレージ エンジンが含まれており、jvm について深く理解しています。開発にどのような言語が使用されても、その背後には Linux、シェル、C/C++、nginx サーバー、mysql が存在することが徐々にわかりました。おそらく、これらの核となる原則を習得することによってのみ、プログラマーは核となる競争力を持つことができます。

BAT のバックエンド部分はこれらのコア技術と切り離せないものですが、フロントエンド (ビジネス ロジック層) は異なります。たとえば、淘宝網は主に Java を使用し、百度は主に PHP を使用します。 Tencent はツールを管理するグループであり、主に C/C++ テクノロジーを使用しています。 Tencent の主な製品は、Windows 上のさまざまなクライアント (QQ、インプット メソッド、音楽...最も重要なのはゲーム) とサーバーです。比較的言えば、Web 製品は比較的少数です (QQ Space、Friends Network など)。これらの Web 製品は比較的成熟しており、改良はたまにしか行われません。新しい製品が登場しない限り、人材の需要は大きくありません。

機械学習とビッグデータマイニングの分野における人材の需要は現在比較的強いようですが、関連テクノロジーは依然として Linux と JVM 上に構築される必要があります。一部の企業では Java 人材の需要がさらに高まるでしょう。

C 言語のコンパイルと接続のプロセス、JVM での Java の実行メカニズムを理解したところで、PHP の実行プロセス、メカニズム、原理について突然興味が湧きました。いくつかのブログを見つけて、大まかなアイデアを掴みました。まずそれを下に置きます:

PHP の基本的な動作原理

はじめに
以下のプロセスを見てみましょう:

    PHP 関連のプロセスを手動で開始したことはありません。PHP は Apache の起動とともに実行されます。PHP は mod_php5.so モジュール (具体的には、SAPI、サーバー アプリケーション プログラミング インターフェイス) を通じて Apache に接続されます。PHP には合計 3 つのモジュールがあります。 、Zend エンジン、および拡張レイヤーは、リクエスト、ファイル ストリーム、エラー処理、およびその他の関連操作を処理するために使用されます。Zend エンジン (ZE) は、ソース ファイルをマシン言語に変換して仮想マシン上で実行するために使用されます。拡張層は、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(拡張機能名){
        /* 関数、クラスなどを初期化します */
        }
        PHP起動ステップ2

          ページリクエストが発生すると、SAPI レイヤーは制御を PHP レイヤーに引き渡します。したがって、PHP は、このリクエストに応答するために必要な環境変数を設定します。同時に、実行中に生成された変数名と値を保存する変数テーブルも作成します。 PHP は各モジュールの RINIT メソッド、つまり「リクエストの初期化」を呼び出します。典型的な例はセッション モジュールの RINIT です。セッション モジュールが php.ini で有効になっている場合、$_SESSION 変数は初期化され、モジュールの 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 の基本的な動作原理

              PHP_PHP チュートリアルの基本的な動作原理から始めましょう

              図1 phpの構造

              写真からもわかるように、PHPは下から上まで4層構造になっています

              ①ゼンドエンジン

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

              ②拡張機能

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

              ③サピ

              Sapi の正式名はサーバー アプリケーション プログラミング インターフェイスであり、Sapi は PHP 自体の非常にエレガントで成功した設計です。上位層のアプリケーションは分離され、分離されます。PHP は異なるアプリケーションとの互換性を考慮できなくなり、アプリケーション自体も独自の特性に応じて異なる処理方法を実装できます。後ほどサピ編で紹介します

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

              これは、私たちが通常作成する PHP プログラムです。Web サーバーを介して Web アプリケーションを実装したり、コマンド ラインでスクリプト モードで実行したりするなど、さまざまな Sapi メソッドを通じてさまざまなアプリケーション モードを取得できます。

              建築思想:

              エンジン(Zend)+コンポーネント(ext)モデルにより内部結合を軽減

              中間層 (sapi) は Web サーバーと php

              を分離します

              ************************************************* * ************************

              php を車に例えると、

              車のフレームワークはphpそのもの

              Zend は車のエンジンです

              Ext の下にあるさまざまなコンポーネントは車の車輪です

              サピは道路に見立てられ、車はさまざまな種類の道路を走行できます

              PHP プログラムの実行は、道路を走る車のようなものです。

              したがって、次のものが必要です: 優れたエンジン + 適切な車輪 + 正しい滑走路

              Apacheとphpの関係

              Apache による php の解析は、多くのモジュールの中の 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 ライフサイクル

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

              Apacheリクエスト処理ループの詳細説明
              Apache リクエスト処理サイクルの 11 段階は何を行うのでしょうか? (これらの 11 のステージは、nginx の 11 の処理ステージに対応しますか? 7mz19O1xLXa0ru49r3Xts6ho7bU09rEx9Cpz+u63NTnvfjI67SmwO3H68fztcTEo7/pw LTLtaOs1eK49r3Xts6/ydLUsbvA+9PDoaM8L3A+CjxwPgogICAgMqGiVVJJIFRyYW5zbGF 0 aW9uvde2ziA8YnI+CiAgICBBcGFjaGXU2rG+vde2zrXE1vfSqrmk1/ejur2rx+vH87XEVV JM07PJ5LW9sb612M7EvP7Ptc2zoaPEo7/pv8nS1NTa1eK917bOsuXI67mz19OjrNa00NDX1 Ly6tcTTs8nkwt+ 8raGjbW9kX2FsaWFzvs3Kx8D708PV4rj2vde2zrmk1/e1xKGjPC9wPgo8cD4KICAgIDOhokhlYWRlciBQYXJzaW5nvde2ziA8YnI+CiAgICBBcGFjaGXU2rG+vde2zrXE1vfSqrmk 1/ejurzssunH6 8fztcTNt7K/oaPTydPaxKO/6b/J0tTU2sfrx/O0psDtwfezzLXEyM66ztK7uPa148nP1rTQ0 mlmvs3Kx8D708PV4rj2vde2zrmk1/e1xKGjPC9wPgo8cD4KICAgIDShokFj Y2VzcyBDb250cm9svde2ziA8YnI+CiagICBBcGFjaGXU2rG+vde2zrXE1vfSqrmk1/ejurj5vt3F5NbDzsS8/rzs sunKx7fx1MrQ7bfDzsrH68fztcTXytS0oaNBcGFjaGW1xLHq17zC37ytyrX P1sHL1MrQ7brNvty++Na4we6ho21vZF9hdXRoel9ob3N0vs3Kx8D708PV4rj2vde2zrmk1/e1xKGjPC9wPgo8cD4 KICAgIDWhokF1dGhlbnRpY2F0aW9uvde2ziA8YnI+CiAgICAgQXBhY2hl1Nqxvr3Xts 61xNb30qq5pNf3o7qwtNXVxeTWw87EvP7J6LaotcSy38LUttTTw7unvfjQ0MjP1qSjrLKiyei2qNPDu 6fD+8f40/Kho8Sjv+m/ydLU1NrV4​​r3Xts6y5cjrubPX06OsyrXP1tK7uPbIz 9akt723qKGj PC9wPgo8cD4KICAgIDahokF1dGhvcml6YXRpb26917bOIDxicj4KICAgIEFwYWNoZdTasb69 17bOtcTW99KquaTX96O6uPm +3cXk1sPOxLz+vOyy6crHt/HUytDtyM/WpLn9tcTTw7un1rTQ0Mfrx /O1xLLZ1/eho8Sjv+m/ydLU1NrV4​​r3Xts6y5cjrubPX06OsyrXP1tK7uPbTw7unyKjP3rncwO21xLe9t6ihozwvcD4KPHA+CiAgICA3oaJNSU1FIFR5cGUgQ2hlY2tpbme917bOIDxicj4KICAgIEFwYWNoZdTasb6917bOtcTW99KquaTX96O6uPm+3cfrx/PXytS0tcRNSU1FwODQzbXEz+C52Lnm1PKjrMXQtqi9q9KqyrnTw7XExNrI3bSmwO26r8r9oaOx6te8xKO/6W1vZF9uZWdvdGlhdGlvbrrNbW9kX21pbWXKtc/WwcvV4rj2ubPX06GjPC9wPgo8cD4KICAgIDihokZpeFVwvde2ziA8YnI+CiAgICDV4srH0ru49s2o08O1xL3Xts6jrNTK0O3Eo7/p1NrE2sjdyfqzycb31q7HsKOs1MvQ0MjOus6x2NKqtcS0psDtwfezzKGjus1Qb3N0X1JlYWRfUmVxdWVzdMDgJiMyMDI4NDujrNXiysfSu7j2xNy5u7K2u/HIzrrO0MXPorXEubPX06Os0rLKx9fus6PKudPDtcS5s9fToaM8L3A+CjxwPgogICAgOaGiUmVzcG9uc2W917bOIDxicj4KICAgIEFwYWNoZdTasb6917bOtcTW99KquaTX96O6yfqzybe1u9i/zbuntsu1xMTayN2jrLi61PC4+L/Nu6e2y7eiy83Su7j2x6G1sbXEu9i4tKGj1eK49r3Xts7Kx9X7uPa0psDtwfezzLXEusvQxLK/t9ahozwvcD4KPHA+CiAgICAxMKGiTG9nZ2luZ73Xts4gPGJyPgogICAgQXBhY2hl1Nqxvr3Xts61xNb30qq5pNf3o7rU2rvYuLTS0b6tt6LLzbj4v827p7bL1q6687zHwrzKws7xoaPEo7/pv8nE3NDeuMS78tXfzOa7u0FwYWNoZbXEserXvMjV1r68x8K8oaM8L3A+CjxwPgoxMaGiQ2xlYW5VcL3Xts4gPGJyPgogICAgQXBhY2hl1Nqxvr3Xts61xNb30qq5pNf3o7rH5cDtsb60zsfrx /PKws7xtKbA7c3qs8nWrrrz0sXB9LXEu7e+s6OsscjI587EvP6hosS/wry1xLSmwO278tXfU29ja2V0tcS52LHVtci1yKOs1eLKx0FwYWNoZdK7tM7H68fztKbA7bXE1+668 9K7uPa917bOoaM8L3A +CjxwPgo8c3Ryb25nPkxBTVC83Lm5o7o8L3N0cm9uZz48L3A+CjxwPgo8aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140607/201406070911023 27.gif" alt=" b簗 ﹊萟?璅裣i啔a篧conf? {鷌?*??sNa pull?'睝_椐鷌荒铻 Yu?凓i僃i?耉谖y?m4簖喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">html

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

              王興斌のブログ http://blog.csdn.net/wanghao72214/article/details/3916825

              http://www.bkjia.com/PHPjc/780964.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/780964.html技術記事私は以前に .net と Java の開発を行ったことがあり、またいくつかの Php Web サイトを作成し、3 つの主要なプログラミング言語のほぼすべてを経験しました。しかし、プログラミングプロセス全体に対する全体的な理解が不足しているとますます感じています...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。