ホームページ >バックエンド開発 >PHPチュートリアル >PHP コア - ユーザー要求の開始と終了

PHP コア - ユーザー要求の開始と終了

WBOY
WBOYオリジナル
2016-06-13 13:12:281135ブラウズ

PHP コア - ユーザー リクエストの開始と終了

Apache をインストールしたことのある人なら誰でも、PHP をインストールした後は、主にこの拡張機能の後に mod_php5.so を追加して Apache を設定するだけであることを知っています。を実行し、Apache を再起動すると、PHP を通常どおり使用できるようになります。このプロセスでは、PHP 関連のプロセスを手動で起動したことはありません。どのように起動するのでしょうか。

サーバーにインストールされた PHP プログラムは、mod_php5.so モジュールを通じて Apache と通信します。このモジュールは本質的に SAPI です。このブログ投稿では、ユーザーリクエストのプロセス、主に通信がどのように行われるかについて説明します。


PHP には主に、カーネル部分、Zend エンジン、拡張部分の 3 つのモジュールが含まれています。

カーネルは主にリクエスト、ファイル ストリーム、エラー処理、その他の関連操作の処理に使用されます。

Zend Engine (ZE) は、ソース ファイルを機械語に変換し、仮想マシン上で実行するために使用されます。

拡張層は、関数、ライブラリ、ストリームのセットです。 PHP は拡張レイヤーを使用して、いくつかの特定の操作を実行します。


リクエストが到着すると、PHP の起動は 2 つの段階に分かれます:

    最初の段階は、Apache の起動から始まります。これは、PHP モジュールを起動することです。この簡単なプロセスについては、ブログ投稿「
  • Apache の PHP モジュールの起動」で説明しています。この段階では、SAPI のライフサイクル全体を通じて表示されるいくつかの環境変数が生成されます。
  • 第 2 段階では、リクエストが到着した後、リクエストに関連するいくつかの環境と変数が生成されます。
第 2 フェーズでは、ページ リクエストが到着すると、SAPI 層 (APACHE) が制御を PHP 層に渡します。このとき、PHP はこのリクエストの処理に使用される環境変数を設定します。次に、PHP は各モジュールの RINT メソッドを呼び出してリクエストを初期化します。これらのモジュールが php.ini ファイルで設定されていることが前提となります。たとえば、mysql モジュールの初期化リクエスト:

もう 1 つの例は、セッション モジュールのリクエストの初期化です

PHP_RINIT_FUNCTION(mysql)
{
#if defined(ZTS) && MYSQL_VERSION_ID >= 40000
        if (mysql_thread_init()) {
                return FAILURE;
        }
#endif
        MySG(default_link)=-1;
        MySG(num_links) = MySG(num_persistent);
        /* Reset connect error/errno on every request */
        MySG(connect_error) = NULL;
        MySG(connect_errno) =0;
        MySG(result_allocated) = 0;

        return SUCCESS;
}

この初期化により、$_SESSION 変数が初期化されます。

PHP_RINIT_FUNCTION(session)
{
        php_rinit_session_globals(TSRMLS_C);

        if (PS(mod) == NULL) {
                char *value;

                value = zend_ini_string("session.save_handler", sizeof("session.save_handler"), 0);
                if (value) {
                        PS(mod) = _php_find_ps_module(value TSRMLS_CC);
                }

                if (!PS(mod)) {
                        /* current status is unusable */
                        PS(session_status) = php_session_disabled;
                        return SUCCESS;
                }
        }

        if (PS(serializer) == NULL) {
                char *value;

                value = zend_ini_string("session.serialize_handler", sizeof("session.serialize_handler"), 0);
                if (value) {
                        PS(serializer) = _php_find_ps_serializer(value TSRMLS_CC);
                }
        }

        if (PS(mod) == NULL || PS(serializer) == NULL) {
                /* current status is unusable */
                PS(session_status) = php_session_disabled;
                return SUCCESS;
        }

        if (PS(auto_start)) {
                php_session_start(TSRMLS_C);
        }

        return SUCCESS;
}


PHP を閉じるときも、

の 2 段階に分かれます。

    フェーズ 1: ページの最後で、各モジュールの PHP_RSHUTDOWN_FUNCTION メソッドが順番に呼び出され、生成された変数とシンボルがクリアされます。
  • など

PHP_RSHUTDOWN_FUNCTION(session)
{
        php_session_flush(TSRMLS_C);
        php_rshutdown_session_globals(TSRMLS_C);

        return SUCCESS;
}
第 2 フェーズ: 最後に、すべてのリクエストが処理され、SAPI を閉じる準備が整います。PHP は第 2 ステップの実行を開始します。これは、各モジュールがメモリを解放する最後の機会です。例:

PHP_MSHUTDOWN_FUNCTION(session)
{
        UNREGISTER_INI_ENTRIES();

#ifdef HAVE_LIBMM
        PHP_MSHUTDOWN(ps_mm) (SHUTDOWN_FUNC_ARGS_PASSTHRU);
#endif

        ps_serializers[PREDEFINED_SERIALIZERS].name = NULL;
        memset(&ps_modules[PREDEFINED_MODULES], 0, (MAX_MODULES-PREDEFINED_MODULES)*sizeof(ps_module *));

        return SUCCESS;
}


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