ホームページ  >  記事  >  PHPフレームワーク  >  thinkphp5 は swoole Ctrip をサポートしていますか?

thinkphp5 は swoole Ctrip をサポートしていますか?

王林
王林転載
2019-09-12 11:38:263432ブラウズ

thinkphp5 は swoole Ctrip をサポートしていますか?

まずは、ThinkPHP の動作仕組みを理解しましょう。

TP5 の動作メカニズム:

すべてのリクエストは tp5 エントリ ファイルを通過し、フレームワーク設定ファイルをロードし、プロセスを開始して、リクエストを処理します。

thinkphp5 は swoole Ctrip をサポートしていますか?

index.php のエントリ ファイルでは、最初に APP_PATH 定数を定義し、次にフレームワークの起動ファイル start.php を導入していることがわかります。 start.php ファイルが何をするのかを見てみましょう。

thinkphp5 は swoole Ctrip をサポートしていますか?

ここでは、最初にベースファイルbase.phpをロードし、次にフレームワークの実行を開始し、リクエストの処理を開始します。

従来の nginx、Apache サーバーでは、リクエストが thinkphp に届くたびに、静的変数がクリアされ、設定ファイルがリロードされます。ただし、swooleで作成したサーバーは常駐プロセスとなっており、サービス起動後はリクエストを処理するために複数のプロセスが生成されます。設定を選択的に読み込むようにしたいと考えています。

http サーバーになる予定です

<?php
$http = new swoole_http_server("0.0.0.0", 8888);

$http->set(
    [
        &#39;enable_static_handler&#39; => true,
        &#39;document_root&#39; => "/data/wwwroot/zhibo/public/static",
        &#39;worker_num&#39; => 5,//产生进程的个数
    ]
);
$http->on(&#39;WorkerStart&#39;,function ($ser,$worker_id){
    define(&#39;APP_PATH&#39;, __DIR__ . &#39;/../application/&#39;);
    require __DIR__ . &#39;/../thinkphp/base.php&#39;;
});
$http->on(&#39;request&#39;, function($request, $response) use($http) {
    if(isset($request->header)){
        foreach ($request->header as $k=>$v){
            $_SERVER[strtoupper($k)] = $v;
        }
    }
    if(isset($request->server)){
        foreach ($request->server as $k=>$v){
            $_HEADER[strtoupper($k)] = $v;
        }
    }
    $_GET = [];
    if(isset($request->get)){
        foreach ($request->get as $k=>$v){
            $_GET[$k] = $v;
        }
    }
    $_POST = [];
    if(isset($request->post)){
        foreach ($request->post as $k=>$v){
            $_POST[$k] = $v;
        }
    }
    // 执行应用并响应
    //开启缓存
    ob_start();
    try{
        think\Container::get(&#39;app&#39;, [APP_PATH])->run()->send();
    }catch (\Exception $e){

    }
    $res = ob_get_contents();
    ob_end_clean();
    $response->end($res);
    //$http->close();
});
$http->start();

コードの説明:

(1)$ http ->onWorkerStart: プロセスの開始時に、thinkphp フレームワーク ファイル、base.php がロードされます。ただし、この時点では実行できません。実行する前にリクエストが来るのを待ちます。

(2) $http->onrequest: クライアントからリクエストを受信した際に、swooleヘッダー情報、サーバー情報、get data、post dataなどのメッセージを通常の$_SERVER、$_GETなどの情報に変換します。 、tp5に適応できます。

(3) いよいよ実行を開始しますが、このとき実行で得た情報をキャッシュにロードし、send()でクライアントに返す必要があります。

Swoole は thinkphp5 に適応します

swoole は常駐プロセスであるため、前のリクエストの $_POST および $_GET リクエストは破棄されません。この時点では、リクエストを受信するときに $_GET と $_POST を空のままにしておく必要があります。

swoole ルーティング メカニズムは、そのようなリクエストがあるかどうかを常にキャッシュから取得します。存在する場合、新しいリクエストはロードされません。したがって、swoole はメモリ内に常駐し、最初の URL が常に要求されました。 swooleサーバーを再起動しない限り。

thinkphp5 は swoole Ctrip をサポートしていますか?

thinkphp フレームワークで、Request ファイルを変更し、2 つのメソッド (pathinfo、path) の $this->path の空の判定を削除して、それぞれの This URL がリクエストごとに解析されます。

#検証結果:

thinkphp5 は swoole Ctrip をサポートしていますか?

thinkphp5 は swoole Ctrip をサポートしていますか?

上記の内容はあくまでも参考です!

関連コンテンツをさらに知りたい場合は、php 中国語 Web サイトにアクセスしてください:

thinkphp チュートリアル

以上がthinkphp5 は swoole Ctrip をサポートしていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。