この記事は、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('LARAVEL_START', microtime(true)); require __DIR__.'/../vendor/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php'; $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('0.0.0.0', 9501); $http->on('Request', 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('Request', 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('Request', 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('/', function () { echo Swoole\Coroutine::getCid(), "<br/>"; print_r(Swoole\Coroutine::stats()); Swoole\Coroutine::sleep(10); echo "<br/>"; echo getmypid(), "<br/>"; // return view('welcome'); });
たくさんの内容を出力しましたが、どれも見覚えがあるはずです。最初の 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( 'worker_num' => 4, // 'worker_num' => 1,单进程 ));
次に、ホームページとこの /a ページに再度アクセスしてください。
Route::get('/a', function () { echo Swoole\Coroutine::getCid(), "<br/>"; print_r(Swoole\Coroutine::stats()); echo "<br/>"; echo getmypid(), "<br/>"; });
見つかりませんでした。プロセス ID はすべて異なります。ブロックされていない場合は、プロセスが最初に切り替えられます。すべてのプロセスがブロックされている場合は、インプロセス用のループでコルーチンが作成されます処理。
以上がLaravelをSwooleバージョンに変更する方法を試してくださいの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。