PHP の拡張機能と埋め込み -- PHP ライフサイクルと変数の詳細な説明_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:18:40
オリジナル
1143 人が閲覧しました

まず、PHP のライフサイクルについて説明します。PHP プログラムが最初から最後までどのようなプロセスを経るのかを理解することは、PHP を学習する上で、また日々の PHP 開発を行う上で非常に重要です。

開始フェーズと終了フェーズ:

  • php の起動フェーズとシャットダウンフェーズは 2 つのレベルに分けることができます。
    • 最初の層は、PHPインタープリター全体による構造体と値の初期化処理です。
    • 2 番目のレイヤーは、各ページのリクエスト プロセス中にあります。
    • 拡張機能ごとに、初期化 MINT 関数が存在します。このプロセスでは、変数、クラス、レジスタ リソース、ストリーム、およびフィルター プロセッサが宣言されます。これらの操作はすべてのリクエストに存在するため、永続的と呼ぶことができます。一般に、次の 2 つの手順が実行されます。
      • REGISTER_INI_ENTRIES()
      • モジュールのグローバル変数を初期化する
      • ページがリクエストを行うと、PHP はシンボル テーブルと設定値を含む動作環境を確立します。次に、PHP インタープリタは各拡張機能を再度実行し、各拡張機能の RINIT 初期化関数を呼び出します。 RINT 関数の一般的な動作は次のとおりです。
        • globalvalue をデフォルト値に設定します。これらのグローバル変数は多くの場合、各リクエストで必要になりますが、各リクエストでは互いに独立しています。
        • 使用する必要がある変数は、呼び出しの準備としてシンボル テーブルに配置する必要があります。
        • この機能では、リクエストの関連情報を記録することもできます
        • リクエストの処理が完了した後、スクリプトの終わりに到達するか、 die() exit() によって終了すると、PHP は RSHUTDOWN() を呼び出してクリーンアップを開始します。
          • このとき、各シンボルテーブルの変数は設定解除されます
          • すべてのリクエストが満たされると、モジュールの MSHUTDOWN プロセスが開始されます。
            • UNREGISTER_INI_ENTRYES()の呼び出しはMINIT関数の初期化処理に相当します。 PHP プログラム実行のライフサイクル:
              ライフサイクルを理解するには、さまざまな実行メソッドを参照する必要があります。 PHP はいくつかの異なる方法で実行でき、それぞれに独自のライフサイクルがあります。
              • CLI: コマンドラインからphpプログラムを実行するもので、ライフサイクルが最も単純です。例えばtest.phpを実行すると以下のような処理が行われます
              • 図 1 CLI PHP 実行プロセス
              • MINIT RINIT RSHUTDOWN MSHUTDOWN は 1 回だけ呼び出されることに注目してください。これはウォーターフォール構造に似ています。
              • マルチスレッドモジュール方式: これは、PHP が Apache と連携する APXS モジュールとして機能する最も一般的に使用される方式です。 Apache が起動すると、多くの子プロセスがフォークされます。複数の異なるリクエストに対して、複数の異なる初期化プロセスと終了プロセスが調整されます。ただし、スレッドごとに、MINIT と MSHUTDOWN の呼び出しは 1 回だけです。各リクエストは、独自の個別の RINIT および RSHUTDOWN に対応します。
              • マルチスレッド モジュール方式: マルチスレッド方式では、異なるスレッドが MINIT/MSHUTDOWN を繰り返し呼び出すことを回避できます。複数のリクエストで情報を共有できるという利点がありますが、リクエスト間の分離要件が比較的高く、そうでない場合は変数が発生する可能性があります。 . アクセスエラー。

                Zend スレッドセーフ
                php には、スレッドセーフリソース管理 (TSRM) と呼ばれる、スレッドセーフのための特別なメカニズムがあります。スレッドセーフな宣言を行う場合と非スレッドセーフな宣言を行う場合には明らかにいくつかの違いがあります:
                • スレッドセーフな変数宣言:
                • typedef 構造体 {
                  intsampint;
                  char *サンプル文字列;
                  php_sample_globals;
                  intsample_globals_id;
                  PHP_MINIT_FUNCTION(サンプル)
                  {
                  ts_allocate_id(&sample_globals_id,
                  sizeof(php_sample_globals),
                  (ts_allocate_ctor) php_sample_globals_ctor,
                  (ts_allocate_dtor) php_sample_globals_dtor);
                  成功を返します;
                  }
                    このコードからわかるように、MINIT ステージでは、ts_allocate_id 関数を通じてこのプログラムが必要とするスペースの量を TSRM に通知する必要があります。これにより、TSRM は現在のスペース消費量を増やし、スレッド データの対応する部分を指す ID を返します。プール。
                  • データへのアクセス要求が行われると、まず現在のスレッドのリソース プールへのポインタが TSRM 層から検出され、次に ts_allocate_id() によって返されたリソース ID がオフセットとして追加されます。
                  • 非スレッドセーフ変数宣言:
                  • typedef 構造体 {
                  • intsampint;
                    char *サンプル文字列;
                    php_sample_globals;
                    php_sample_globals サンプル_グローバル;
                    PHP_MINIT_FUNCTION(サンプル)
                    {
                    php_sample_globals_ctor(&sample_globals TSRMLS_CC);
                    成功を返します;
                    }
                      非スレッド セーフの場合は、単に変数を宣言するだけで済み、スレッド セーフの場合のように実行時の計算が必要になるのではなく、コンパイル段階でデータのアドレスを決定することができ、より高速かつ効率的になります。 。同時に、プログラムのバグによって Web サーバー全体が停止することがないという利点もあります。したがって、スレッド セーフが必要ない場合は、非スレッド セーフ宣言メソッドを可能な限り使用する必要があります。
                    • スレッドセーフな PHP をビルドするには、コンパイル時に --enable-maintainer-zts オプションを追加する必要があります。プログラム内で検出する場合、#ifdef ZTS を使用できます。この検出により、次の例に示すように、グローバル変数宣言のさまざまな処理を実装できます。
                    • #ifdef ZTS

                      #define HELLO_G(v) TSRMG(hello_globals_id, zend_hello_globals *, v)
                      #その他
                      #define HELLO_G(v) (hello_globals.v)
                      #endif

                        スレッド セーフが有効かどうかを判断することにより、変数はさまざまな方法で宣言され、アクセスされます。
                      • スレッドセーフを有効にした後、異なるスレッド間のデータを区別するために、PHP は tsrm_ls ポインターを自動的に有効にします。このポインタの助けを借りて、各スレッドの関数は対応するシンボル テーブルを見つけて、対応する変数読み取り操作を実行できます。複数のスレッドが連携するときにデータスペースが混乱するのを防ぐのはこのメカニズムです。

                      • PHP の開始段階と終了段階、ライフサイクル、Zend スレッド セーフティ メカニズムを理解することは、その後の PHP 拡張コンパイルの研究に役立ちます。

                        http://www.bkjia.com/PHPjc/621631.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/621631.html技術記事まず、PHP のライフサイクルを紹介します。PHP プログラムの最初から最後までのプロセスを理解することは、PHP の学習と日常の PHP 開発にとって非常に重要です。 スタート...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート