ホームページ  >  記事  >  PHPフレームワーク  >  Swoole 非同期プログラミングの実践: Web サービスのパフォーマンスを 10 倍向上させる

Swoole 非同期プログラミングの実践: Web サービスのパフォーマンスを 10 倍向上させる

WBOY
WBOYオリジナル
2023-06-13 21:41:311399ブラウズ

インターネットの急速な発展に伴い、Web開発に取り組む企業が増えており、Webサービスのパフォーマンスをいかに向上させるかが重要な課題となっています。近年、ネットワークのIO効率を向上させる技術として非同期プログラミングが徐々に普及しており、Swooleフレームワークは非同期プログラミングの代表的なものの1つです。この記事では、Swoole フレームワークを介して非同期プログラミングを実装する方法を紹介し、Web サービスのパフォーマンス向上におけるその大きな効果を実証します。

1. Swoole とは

Swoole は、高性能、非同期、同時ネットワーク通信フレームワークです。これにより、PHP 開発者は非同期コードを簡単に作成でき、コードの効率とパフォーマンスが向上します。 Swoole は、TCP/UDP/Unix ドメイン ソケット、HTTP サーバー、WebSocket サーバーに加え、非同期テキスト、JSON シリアル化および逆シリアル化機能を提供します。現在、Swoole はますます多くの PHP 開発者に支持されています。

2. Swoole を使用する際のいくつかの注意点

1. コルーチンの有効化:

Swoole では、非同期プログラミングをサポートするために、コルーチンを有効にする必要があります。コルーチンは、コンテキスト切り替えやカーネル モード リソースによる追加のオーバーヘッドがないため、スレッドよりも軽量なスケジューリング方法です。

Swoole の使い方 コルーチンを使うと非常に便利です。エントリーファイルまたは Swoole サーバーオブジェクトに次のコードを追加するだけです:

SwooleRuntime::enableCoroutine();

このようにして、コルーチン関数を使用することができます。スウール社から提供されました。

2. メモリ リークに注意する:

Swoole を非同期プログラミングに使用する場合は、メモリ リークに注意する必要があります。非同期プログラミングのコルーチンは長時間I/Oを待つことになるため、メモリの解放が間に合わないとメモリの無駄遣いが発生します。

Swoole は、コルーチン コンテキストをクリーンアップするメソッド Coroutine::defer() を提供します。これを使用して、コルーチンの最後にあるコンテキストをクリーンアップします (例:

SwooleCoroutineun(function () {
    echo "Coroutine Start
";
    Coroutine::defer(function () {
        echo "Coroutine End
";
    });
});

3)。Swoole のバージョンに注意してください:

Swoole の新しいバージョンは引き続き最適化されます。改良されたため、最新バージョンを使用する必要があります。同時に、コードの互換性と安定性を確保するために、各バージョンの変更に注意を払う必要があります。

3. Swoole の実践: Web サービスのパフォーマンスの向上

以下では、簡単な例を使用して、Swoole フレームワークを使用して Web サービスのパフォーマンスを向上させる方法を示します。

最初に単純な PHP ファイルserver.php を作成します。このファイルはローカル 9501 ポートをリッスンし、Hello World 文字列を返します:

<?php
$http = new SwooleHttpServer("0.0.0.0", 9501);

$http->on("request", function ($request, $response) {
    $response->header("Content-Type", "text/plain");
    $response->end("Hello World!
");
});

$http->start();

コマンド ラインを使用してこのファイルを実行し、アクセスします。 http://127.0.0.1:9501/ を見ると、Hello World が出力されていることがわかります。

ここで、このサーバーのコードを非同期モードに変更します。

<?php
$http = new SwooleHttpServer("0.0.0.0", 9501, SWOOLE_BASE);

$http->on("request", function ($request, $response) {
    $response->header("Content-Type", "text/plain");
    $response->end("Hello World!
");
});

$http->start();

上記のコードでは、SWOOLE_BASE モードを使用してサーバーを起動するための 3 番目のパラメーターを追加しました。このようにして、Swoole が提供するコルーチン、非同期 IO、およびイベント リスニング機能を使用できます。

次に、Apache Bench ツールを使用して、大量のリクエストを処理するときのサーバーのパフォーマンスをテストします。

Apache Bench ツールは、実際の HTTP リクエストをシミュレートできます。このツールが提供するマルチスレッドの同時リクエストを使用して、同時にサーバーにアクセスする複数のユーザーをシミュレートし、さまざまなリクエスト負荷の下でサーバーのパフォーマンスをテストできます。

ターミナルに次のコマンドを入力して、Apache Bench ツールをインストールします:

# ubuntu
sudo apt-get install apache2-utils

# centos
sudo yum install httpd-tools

次のコマンドを使用して、サーバーのパフォーマンスを今すぐテストします:

ab -n 1000 -c 100 http://127.0.0.1:9501

このコマンドでは、 -n パラメータを使用してリクエストの総数を示し、-c パラメータは同時リクエストの数を示します。リクエストの合計数を 1000 に、同時リクエストの合計数を 100 に設定します。

テストが完了すると、Apache Bench によって出力されたテスト結果が表示されます。

Concurrency Level:      100
Time taken for tests:   0.041 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      110000 bytes
HTML transferred:       12000 bytes
Requests per second:    24540.63 [#/sec] (mean)
Time per request:       4.075 [ms] (mean)
Time per request:       0.041 [ms] (mean, across all concurrent requests)
Transfer rate:          2624.27 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0       1
Processing:     1    4   0.5      4       6
Waiting:        0    4   0.5      4       6
Total:          1    4   0.5      4       6

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      4
  75%      4
  80%      4
  90%      4
  95%      5
  98%      5
  99%      5
 100%      6 (longest request)

このサーバーが 1000 リクエストを処理すると、各リクエストの平均応答時間が 4.075 であることがわかります。ミリ秒の場合、1 秒あたりの応答リクエストの数は約 24540 です。このパフォーマンス結果はすでに非常に良好です。

次に、サーバーの負荷を増やして、同時実行性が高い条件下で Swoole フレームワークがどのように動作するかを確認します。同時リクエストの数を 1000 に増やします。

ab -n 10000 -c 1000 http://127.0.0.1:9501

テストが完了すると、Apache Bench によってテスト結果が再度出力されます。

Concurrency Level:      1000
Time taken for tests:   2.437 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      1100000 bytes
HTML transferred:       120000 bytes
Requests per second:    4107.95 [#/sec] (mean)
Time per request:       243.651 [ms] (mean)
Time per request:       0.244 [ms] (mean, across all concurrent requests)
Transfer rate:          441.50 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    8  84.5      0     1000
Processing:     1   22  16.0     20      176
Waiting:        0   21  16.0     20      176
Total:          1   30  86.2     20     1001

Percentage of the requests served within a certain time (ms)
  50%     20
  66%     23
  75%     25
  80%     26
  90%     30
  95%     41
  98%     52
  99%     65
 100%   1001 (longest request)

同時リクエストの数が 1000 に達しても、このサーバーの応答時間はわずか約 200 ミリ秒です。非同期プログラミングを使用する同期 Web サーバーと比較して、Swoole は同時実行性とパフォーマンスを大幅に向上させることができます。

4. 概要

この記事では、Web サービスのパフォーマンスを向上させるための Swoole フレームワークとそのアプリケーションを紹介します。 Swoole を使用してコルーチンを開始する方法、メモリ リークに注意する方法、および Swoole 非同期サーバーのパフォーマンスをテストする方法を学びました。

実際には、Swoole ツールや Apache Bench ツールなどの効率的なツールを使用して、Web サービスのパフォーマンスを向上させることができます。インターネット上の同時実行性の高いシナリオでは、非同期プログラミングに Swoole を使用すると、サーバーのパフォーマンスが大幅に向上し、企業の高パフォーマンス Web サービスのニーズを満たすことができます。

以上がSwoole 非同期プログラミングの実践: Web サービスのパフォーマンスを 10 倍向上させるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。