swooleを使用してlaravelアプリケーションを改造する


swooleを使用してlaravelアプリケーションを改造する
ラベル(スペース区切り):php
1.概要
1.1 swooleの紹介
SwooleはPHPのために開発された生産レベルの非同期プログラミングフレームワークである.彼は純粋なC開発の拡張で、彼はPHP開発者がPHPの中で高性能を書くことを許可して、拡張可能な同時TCP、UDP、Unix socket、HTTP、WebSocketサービス、多すぎる非ブロックI/Oプログラミングと低レベルのLinuxカーネルの知識を持つ必要はありません.SwooleはGoと想像できますが、PHPにとってはより高性能になります.
1.2 SwooleでLaravelを実行する理由
PHPのライフサイクルでは、PHPスクリプトを実行するたびに、PHPはモジュールを初期化し、実行環境のzendエンジンを起動する必要があります.PHPスクリプトをOpCodesにコンパイルして、Zendエンジンで実行します.
ただし、このようなライフサイクルは、単一のリクエストが作成する環境がリクエストが終了すると直ちに破棄されるため、リクエストのたびに1回実行する必要がある.
すなわち、従来のPHPライフサイクルでは、スクリプトの実行に多くの時間を費やしてリソースを作成および破棄しています.laravelのようなフレームワークでは、リクエストごとにどのくらいのファイルをロードする必要があるか想像してみてください.同時にI/O操作を大量に浪費する.
swooleはアプリケーションレベルに組み込まれたserverであり、すべてのスクリプトファイルを一度ロードするとメモリに保存できます.これは、swoole上でlaravelを実行する必要がある理由です.
swooleは強力な性能を提供し、Laravelは優雅なコード構造を提供することができます.完璧です!
2.準備
app
php
laravel
swoole
your.domain.com
7.1.16
5.4.36
4.1.2
2.1 wrk
データムテストツール:wrk
// wrk    
-c, --connections: total number of HTTP connections to keep open with
                   each thread handling N = connections/threads

-d, --duration:    duration of the test, e.g. 2s, 2m, 2h

-t, --threads:     total number of threads to use

-s, --script:      LuaJIT script, see SCRIPTING

-H, --header:      HTTP header to add to request, e.g. "User-Agent: wrk"

    --latency:     print detailed latency statistics

    --timeout:     record a timeout if a response is not received within
                   this amount of time.

2.2 php-swooleインストールpecl install swoole
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    && sed -i 's/nl.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add --no-cache --virtual .build-deps \
        $PHPIZE_DEPS \
    && docker-php-source extract \
    && cd /usr/src \
    && wget http://pecl.php.net/get/swoole-4.1.2.tgz \
    && tar -xzvf swoole-4.1.2.tgz \
    && mv /usr/src/swoole-4.1.2 /usr/src/php/ext/swoole \
    && docker-php-ext-configure swoole --enable-openssl \
    && docker-php-ext-install swoole \
    && runDeps="$( \
        scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \
            | tr ',' '
' \ | sort -u \ | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ )" \ && apk add --no-cache --virtual .php-rundeps $runDeps \ && docker-php-source delete \ && apk del .build-deps \ && rm -rf /usr/src/swoole-4.1.2.tgz

2.3 laravel-swoole拡張インストール
以下はswooletw/laravel-swooleの主な特徴です.
  • SwooleでLaravel/Loumenアプリケーション
  • を実行
  • の優れたパフォーマンスを30 x
  • に向上
  • 砂箱モード分離アプリケーションコンテナ
  • は、LaravelアプリケーションでWebSocketサーバ
  • を実行することをサポートします.
  • Socket.ioプロトコル
  • をサポート
  • は、Swooleテーブルのプロセス間共有
  • をサポートします.
    Composerを使用してインストールするには、次の手順に従います.
    $ composer require swooletw/laravel-swoole

    2.4 laravel/lumen構成
    このパッケージは、パッケージの自動検出メカニズムをサポートします.Laravel 5.5以上のバージョンを実行する場合は、このステップをスキップできます.
    Laravel構成:config/app.phpサービスプロバイダ配列にサービスプロバイダを追加
    [
        'providers' => [
            SwooleTW\Http\LaravelServiceProvider::class,
        ],
    ]

    lumen構成:bootstrap/app.phpに次のコードを追加してください
    $app->register(SwooleTW\Http\LumenServiceProvider::class);

    3.基準テストデータ
    3.1構築して実行する
    これで、以下のコマンドを実行してSwoole HTTPサービスを開始できます.
    php artisan swoole:http start

    次の情報が表示されます.
    Starting swoole http server...
    Swoole http server started: http://127.0.0.1:1215 http://127.0.0.1:1215にアクセスしてLaravelアプリケーションにアクセスできるようになりました.
    ポート番号またはサービス・アドレスを変更する必要がある場合は、対応する環境変数を構成します.
    // vendor/swooletw/laravel-swoole/config/swoole_http.php
    SWOOLE_HTTP_HOST: '127.0.0.1'
    SWOOLE_HTTP_PORT: '1215'

    詳細なドキュメントリファレンス:https://wiki.swoole.com/wiki/page/14.html
    3.2 FPM+Nginxに基づくテスト結果
    wrk -t4 -c100 http://your.domain.com/version
    
    Running 10s test @ http://your.domain.com/version
      4 threads and 100 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency   341.64ms  108.70ms 801.47ms   69.08%
        Req/Sec    71.72     27.35   171.00     65.57%
      2864 requests in 10.03s, 2.84MB read
    Requests/sec:    285.63
    Transfer/sec:    289.79KB
    wrk -t12 -c400 -d30s http://your.domain.com/version
    
    Running 30s test @ http://your.domain.com/version
      12 threads and 400 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency   801.35ms  349.89ms   2.00s    68.56%
        Req/Sec    40.61     19.83   126.00     65.80%
      14390 requests in 30.10s, 14.24MB read
      Socket errors: connect 0, read 0, write 0, timeout 132
    Requests/sec:    478.09
    Transfer/sec:    484.34KB

    3.3 Swoole HTTPサービスのテスト結果
    wrk -t4 -c100 http://your.domain.com/version
    
    Running 10s test @ http://your.domain.com/version
      4 threads and 100 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency   198.64ms  324.54ms   1.96s    88.59%
        Req/Sec   225.62     91.30   430.00     62.72%
      9021 requests in 10.09s, 7.90MB read
      Socket errors: connect 0, read 0, write 0, timeout 25
    Requests/sec:    893.71
    Transfer/sec:    801.26KB
    wrk -t12 -c400 -d30s http://your.domain.com/version
    
    Running 30s test @ http://your.domain.com/version
      12 threads and 400 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency   319.84ms  398.59ms   2.00s    85.59%
        Req/Sec    66.94     35.58   240.00     66.09%
      23862 requests in 30.09s, 20.89MB read
      Socket errors: connect 0, read 0, write 0, timeout 619
    Requests/sec:    793.04
    Transfer/sec:    711.05KB

    4.質問&注意事項
  • php 7はswoole 4.0+バージョン
  • のみ使用可能
    4.1静的ファイルのswooleパフォーマンスの使用は影響を受けますか?
    Nginxを使用して、Swoole上で実行されるLaravelをエージェントします.
    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;
        }
    }

    5.参考
  • Swooleを使用してLaravelアプリケーション
  • を加速
  • swoole入門ガイド
  • laravel-swoole