ホームページ > PHPフレームワーク > Laravel > LaravelをSwooleバージョンに変更する方法を試してください

LaravelをSwooleバージョンに変更する方法を試してください

藏色散人
リリース: 2022-12-02 16:29:02
転載
1253 人が閲覧しました

この記事は、Laravel と Swoole に関する関連知識を提供します。主な内容は、Laravel を Swoole バージョンに変更する方法を説明することです (既存のプロジェクトを変更することはお勧めできませんので、学習してください)。皆さんのお役に立てれば幸いです。役に立ちました!

まえがき

本番環境での使用は推奨されません

新しいlaravelプロジェクトを作成します

laravel new swoole-laravel
ログイン後にコピー

Laravel を Swoole バージョンに変更する

Laravel のルート ディレクトリに swoole_server.php ファイルを作成し、public/index.php にコードをコピーします [推奨学習: laravel ビデオチュートリアル ]

<?php
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;
define(&#39;LARAVEL_START&#39;, microtime(true));
require __DIR__.&#39;/../vendor/autoload.php&#39;;
$app = require_once __DIR__.&#39;/../bootstrap/app.php&#39;;
$kernel = $app->make(Kernel::class);
$response = $kernel->handle(
    $request = Request::capture()
)->send();
$kernel->terminate($request, $response);
ログイン後にコピー

最初のステップでは、フレームワーク ファイルのロードは確実であり、メイン プロセスでロードされる必要があります。サブプロセスやコルーチンは必要ありません。繰り返しロードしてください。したがって、上記のrequireには触れる必要はありません。

2 番目のステップは、HTTP Swoole サービスを開始することです。これについては何度も述べていますが、onRequest に $kernel 関連のコードを含める必要があることに注意してください。

$http = new Swoole\Http\Server(&#39;0.0.0.0&#39;, 9501);
$http->on(&#39;Request&#39;, function ($req, $res) use($app) {
    try {
        $kernel = $app->make(Kernel::class);
        $response = $kernel->handle(
            $request = Request::capture()
        )->send();
        $kernel->terminate($request, $response);
    }catch(\Exception $e){
        print_r($e->getMessage());
    }
});
echo "服务启动", PHP_EOL;
$http->start();
ログイン後にコピー

これで十分ですか?まずは試してみてはいかがでしょうか。通常であれば入力や出力が得られない場合がありますが、これはなぜでしょうか?

3 番目のステップは入力の問題を解決することですが、実際には Swoole ではスーパーグローバル変数が機能しないため、$_GET などの変数は無効になり、Laravel のリクエスト関連オブジェクトは無効になります。データを取得します。これについてはどうすればよいでしょうか?このデータを onRequest のパラメーターから取得し、現在のプロセス コルーチンの $_GET に戻すだけです。

$http->on(&#39;Request&#39;, function ($req, $res) use($app) {
    $_SERVER = [];
    if(isset($req->server)){
        foreach($req->server as $k => $v){
            $_SERVER[strtoupper($k)] = $v;
        }
    }
    $_GET = [];
    if(isset($req->get)){
        foreach ($req->get as $k => $v){
            $_GET[$k] = $v;
        }
    }
    $_POST = [];
    if(isset($req->post)){
        foreach ($req->post as $k => $v){
            $_POST[$k] = $v;
        }
    }
    try {
        $kernel = $app->make(Kernel::class);
        $response = $kernel->handle(
            $request = Request::capture()
        )->send();
        $kernel->terminate($request, $response);
    }catch(\Exception $e){
        print_r($e->getMessage());
    }
});
ログイン後にコピー

上記の 3 つのコードは、$_SERVER、$_GET、$_POST の問題をそれぞれ解決します。ここで再試行するとパラメータは受信できるのですが、コンソールに出力が表示されるのはなぜでしょうか。

4 番目のステップは、出力の問題を解決し、フレーム内のすべての出力を出力バッファーに入れ、Swoole の応答を使用して返します。

$http->on(&#39;Request&#39;, function ($req, $res) use($app) {
    $_SERVER = [];
    if(isset($req->server)){
        foreach($req->server as $k => $v){
            $_SERVER[strtoupper($k)] = $v;
        }
    }
    $_GET = [];
    if(isset($req->get)){
        foreach ($req->get as $k => $v){
            $_GET[$k] = $v;
        }
    }
    $_POST = [];
    if(isset($req->post)){
        foreach ($req->post as $k => $v){
            $_POST[$k] = $v;
        }
    }
    //把返回放到一个缓冲区里
    ob_start();
    try {
        $kernel = $app->make(Kernel::class);
        $response = $kernel->handle(
            $request = Request::capture()
        )->send();
        $kernel->terminate($request, $response);
    }catch(\Exception $e){
        print_r($e->getMessage());
    }
    $ob = ob_get_contents();
    ob_end_clean();
    $res->end($ob);
});
ログイン後にコピー

最後の ob_start() の内容も以前に学習した内容なので、これ以上の説明は省略します。

すべてのコード

start();
ログイン後にコピー

この時点で、最も単純なフレームワークの変換が完了しました。早速エフェクトを試してみましょう。

実行

php swoole_server.php
ログイン後にコピー

アクセス

http://47.113.xxx.xx:9501/
ログイン後にコピー

コルーチン効果を試す

最初にルートを定義します。または、デフォルトのルートを直接変更することもできます。

Route::get(&#39;/&#39;, function () {
    echo Swoole\Coroutine::getCid(), "<br/>";
    print_r(Swoole\Coroutine::stats());
    Swoole\Coroutine::sleep(10);
    echo "<br/>";
    echo getmypid(), "<br/>";
//    return view(&#39;welcome&#39;);
});
ログイン後にコピー

たくさんの内容を出力しましたが、どれも見覚えがあるはずです。最初の 2 つはコルーチン ID とコルーチン情報の出力で、次に Swoole\Coroutine::sleep () を 10 秒間実行し、その後print プロセス ID を示します。

次に、ブラウザを開いて 2 つのタブに一緒にアクセスする準備をします。

rreeee

見えますか?各 onRequest イベントは、実際にはリクエストを処理するために新しいコルーチンを開くため、コルーチン ID は異なります。同時に、最初のリクエストがブロックされているため、2 番目のリクエストは返されるまで 20 秒待機しません。最後に、コルーチンのステータスでは、2 番目のリクエストに 2 つの coroutine_num が表示されていることもわかります。これは、現在 2 つのコルーチンがタスクを処理していることを示しています。結局のところ、プロセスは同じであり、すべて同じプロセスに従います。

マルチプロセス効果を試す

デフォルトでは、上記のコードはメイン プロセスとワーカー プロセスであり、コルーチン機能を使用します。実際、この効果は通常の PHP-FPM 効果を即座に無効にすることができます。ただし、マルチコア マシンのパフォーマンスを最大限に活用する必要があります。つまり、マルチプロセスを有効にし、マルチプロセスとマルチコルーチンの超強力な処理モードを使用します。最も簡単な方法は、HTTP サービスのプロセス ワーカーの数を直接設定することです。

// 第一个访问的页面
1
Array
(
    [event_num] => 2
    [signal_listener_num] => 0
    [aio_task_num] => 0
    [aio_worker_num] => 0
    [aio_queue_size] => 0
    [c_stack_size] => 2097152
    [coroutine_num] => 1
    [coroutine_peak_num] => 1
    [coroutine_last_cid] => 1
)
1468
// 第二个访问的页面
2
Array
(
    [event_num] => 2
    [signal_listener_num] => 0
    [aio_task_num] => 0
    [aio_worker_num] => 0
    [aio_queue_size] => 0
    [c_stack_size] => 2097152
    [coroutine_num] => 2
    [coroutine_peak_num] => 2
    [coroutine_last_cid] => 2
)
1468
ログイン後にコピー

ここでサーバーを実行すると、さらにいくつかのプロセスが表示されることがわかります。次に、新しいテスト ルートを作成します

$http->set(array(
    &#39;worker_num&#39; => 4,
      // &#39;worker_num&#39; => 1,单进程
));
ログイン後にコピー

次に、ホームページとこの /a ページに再度アクセスしてください。

Route::get(&#39;/a&#39;, function () {
    echo Swoole\Coroutine::getCid(), "<br/>";
    print_r(Swoole\Coroutine::stats());
    echo "<br/>";
    echo getmypid(), "<br/>";
});
ログイン後にコピー

見つかりませんでした。プロセス ID はすべて異なります。ブロックされていない場合は、プロセスが最初に切り替えられます。すべてのプロセスがブロックされている場合は、インプロセス用のループでコルーチンが作成されます処理。

以上がLaravelをSwooleバージョンに変更する方法を試してくださいの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート