ホームページ  >  記事  >  バックエンド開発  >  Laravelアプリケーションを高速化するためのswoole実行モードの詳細な紹介

Laravelアプリケーションを高速化するためのswoole実行モードの詳細な紹介

不言
不言転載
2018-12-29 09:52:253772ブラウズ

この記事では、laravel アプリケーションを高速化するための swoole 実行モードについて詳しく説明します。一定の参考値があります。必要な友人は参考にしてください。お役に立てれば幸いです。

1. Swoole

Swoole は PHP を再定義したと主張しています。これは、Node のように PHP を非同期で実行できるようにする PHP 拡張機能です。ソケットも使用でき、PHP に一連の非同期 IO、イベント駆動型、並列データ構造関数を提供します。
Swoole4 は完全なコルーチン プログラミング モデルをサポートしており、完全同期コードを使用して非同期プログラムを実装できます。 PHP コードにキーワードを追加する必要はなく、最下層でコルーチン スケジューリングが自動的に実行され、非同期 IO が実装されます。
nodejs で実装できる swoole はほぼすべて実現でき、nodejs よりも性能が高いです 結局のところ、nodejs はシングルスレッドなので CPU の性能を使いきれませんが、swoole はマルチスレッドなので CPU の性能を十分に活用できますCPUの性能。
Swoole の効率と従来の Web 開発の違いは何ですか? 従来の LAMP/LNMP 同期開発モデルに加えて、Swoole の非同期開発モデルとは何ですか?また効率を維持する方法は何ですか?

2. 従来の Web 開発モデル
PHP Web 開発で使用される手法は、LAMP/LNMP アーキテクチャ、つまり Linux、Nginx、Mysql、および PHP です。例として nginx を示します。一般的な構造は次のとおりです:

Laravelアプリケーションを高速化するためのswoole実行モードの詳細な紹介

リクエストが受信されると、Web サーバーはそのリクエストを PHP-FPM に転送します。 PHP-FPM は、プロセス プール アーキテクチャと組み込みの PHP インタープリターを備えた FastCGI サービスです。 FPM は、PHP ファイルを解釈して実行して応答を生成し、最終的に Web サーバーに返されてフロントエンドに表示されます。 Mysql や Nosql へのアクセス、サードパーティ アプリケーションの呼び出しなど、多くのビジネス ロジックが PHP ファイルに実装されています。
このような構造で、php-fpm と nginx の連携は十分に機能していますが、php-fpm 自体が同期ブロッキング プロセス モデルであるため、すべてのリソース (フレームワークの初期化によって作成された一連のオブジェクトを含む) が終了後に解放されます。これにより、PHP プロセスが「アイドル」状態になり (create destroy create)、大量の CPU リソースが消費され、その結果、単一マシンのスループット容量が制限されます。

各リクエスト処理プロセスには、PHP ファイルの解析や環境設定などの無駄な時間のかかる操作が含まれます。PHP プロセスは処理後に破棄されます。PHP プログラムで接続プーリングなどのテクノロジを使用してパフォーマンスを最適化することは不可能です。 。

3. Swoole の動作モード
従来のアーキテクチャの問題点を考慮して、swoole は PHP 拡張機能から出発し、上記の問題を解決します。 。

従来のアーキテクチャと比較した場合、Swoole プロセス モデルの最大の特徴は、ネットワーク リクエストを処理するためのマルチスレッド Reactor モードであり、多数の接続を簡単に処理できることです。

さらに、次のような利点もあります。

完全に非同期でノンブロッキング、リソース消費が少なく、プログラムの実行効率が高い

プログラムは PHP ファイルを解析してロードするだけです。リクエストごとに繰り返しロードすることを避ける

プロセスが常駐するため、リクエスト間の接続プーリングと情報転送の実装が可能になります

4.Swoole で Laravel を実行する理由
Laravel フレームワークは起動時に大量のファイルをロードする必要があり、また、生態環境が良好なことで有名なので、開発プロセス中にすでに構築されたホイールがたくさんあることがわかります。これは、Laravel の起動時のディスク IO が非常に高くなる (つまり、多くのファイルをロードする必要がある) ことを意味します。
laravel ライフサイクルは、リクエストが行われるたびに実行する必要があります。単一のリクエストによって作成された環境は、リクエストの実行が完了するとすぐに破棄されるためです。
言い換えれば、従来の PHP ライフサイクルでは、スクリプト実行のためのリソースの作成と破棄に多くの時間が無駄になります。 Laravel のようなフレームワークを想像してみてください。各リクエストでいくつのファイルをロードする必要があるでしょうか? また、多くの I/O 操作が無駄になります。

では、Swoole を使用してアプリケーション レベルのサーバーを構築し、すべてのスクリプト ファイルを一度読み込んだ後にメモリに保存できるとしたらどうなるでしょうか?これが、Swoole 上で Laravel を実行してみる必要がある理由です。 Swoole は強力なパフォーマンスを提供し、Laravel はエレガントなコード構造の使用法を提供します。この 2 つは本当に完璧な組み合わせです!

5.Swoole を使用して Laravel のパフォーマンスを向上させます
既存のホイールの中では、次の 2 つがまだ優れていると感じます。自分で選ぶことができます

  • swooletw/laravel-swoole

  • garveen/laravole

私は選びました最初の
テストするには、composer を使用してインストールします:

composer require swooletw/laravel-swoole

laravel を使用している場合は、config/app.php のプロバイダー配列に

SwooleTW\Http\LaravelServiceProvider::class,

を追加します。次に、次のコードを bootstrap/app.php に追加します

$app->register(SwooleTW\Http\LumenServiceProvider::class);

設定ファイルを config ディレクトリにエクスポートします

php artisan vendor:publish --provider="SwooleTW\Http\HttpServiceProvider"

その後、config/swoole_http.php に移動して情報を設定できます

'server' => [
        'host' => env('SWOOLE_HTTP_HOST', '0.0.0.0'),//监听任意ip
        'port' => env('SWOOLE_HTTP_PORT', '1215'),
        'options' => [
            'pid_file' => env('SWOOLE_HTTP_PID_FILE', base_path('storage/logs/swoole_http.pid')),
            'log_file' => env('SWOOLE_HTTP_LOG_FILE', base_path('storage/logs/swoole_http.log')),
            'daemonize' => env('SWOOLE_HTTP_DAEMONIZE', 1),//1-程序将转入后台作为守护进程运行
        ],
],

swoole_http.php は、構成プロバイダーの配列も提供します。

'providers' => [
    // App\Providers\AuthServiceProvider::class,
]

swoole を http として使用した後、これらのプロバイダーはメモリに保存されるため、ここで構成されているのは再登録して再起動することです。すべてのリクエスト、プロバイダー。
これで、次のコマンドを実行して Swoole HTTP サービスを開始できます。

$ php artisan swoole:http start

然后你可以看到以下信息:

Starting swoole http server...
Swoole http server started: <http:></http:>

现在可以通过访问 http://127.0.0.1:1215 来进入 Laravel 应用。
注意:该拓展是不支持热启动的,所以每次有代码更新都要重启服务 php artisan swoole:http restart

六、性能测试
使用Apache的ab测试工具

ab -n 1000 -c 10 http://127.0.0.1:1215/

参数说明:-n 1000个请求 -c 10个并发数

Laravelアプリケーションを高速化するためのswoole実行モードの詳細な紹介

Laravelアプリケーションを高速化するためのswoole実行モードの詳細な紹介

图一是使用swoole作为应用服务器,图二是apache服务器
测试环境在虚拟机中,电脑配置也较差,性能没有完全发挥出来,可以看到apache只完成197次请求就扛不住压力了,swoole HTTP服务 完成了压测,性功完全碾压apache服务器。

七、使用Nginx代理

swoole在官网也提到过:swoole_http_server对Http协议的支持并不完整,建议仅作为应用服务器。并且在前端增加Nginx作为代理。
那么,我们就增加需要配置nginx.conf里的server:

server {
    listen 80;
    server_name your.domain.com;
    root /path/to/laravel/public;
    index index.php;

    location = /index.php {
        # Ensure that there is no such file named "not_exists"
        # in your "public" directory.
        try_files /not_exists @swoole;
    }

    location / {
        try_files $uri $uri/ @swoole;
    }

    location @swoole {
        set $suffix "";

        if ($uri = /index.php) {
            set $suffix "/";
        }

        proxy_set_header Host $host;
        proxy_set_header SERVER_PORT $server_port;
        proxy_set_header REMOTE_ADDR $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # IF https
        # proxy_set_header HTTPS "on";

        proxy_pass http://127.0.0.1:1215$suffix;
    }
}

配置可参考swoole方文档官 Nginx/Apache配置
至此,大功告成,你可以像平常一样访问你的网站了。

八、使用swoole和传统php开发的缺点
本文主要介绍了使用swoole作为laravel的应服务器,最后说下使用swoole和传统php开发的缺点。
1、更难上手。这要求开发人员对于多进程的运行模式有更清晰的认识
2、更容易内存泄露。在处理全局变量,静态变量的时候一定要小心,这种不会被GC清理的变量会存在整个生命周期中,如果没有正确的处理,很容易消耗完所有的内存。在php-fpm下,php代码执行完内存就会被完全释放。


以上がLaravelアプリケーションを高速化するためのswoole実行モードの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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