ホームページ  >  記事  >  PHPフレームワーク  >  swooleはマルチスレッドをサポートしていますか?

swooleはマルチスレッドをサポートしていますか?

青灯夜游
青灯夜游オリジナル
2019-12-25 18:18:244119ブラウズ

swooleはマルチスレッドをサポートしていますか?

リアクター スレッド

Swoole\Server のメイン プロセスはマルチスレッド プログラムです。 Reactor スレッドと呼ばれる非常に重要なスレッドのグループがあります。実際に TCP 接続を処理し、データを送受信するのはスレッドです。

新しい接続を受け入れた後、Swoole のメイン スレッドはその接続を固定 Reactor スレッドに割り当て、このスレッドがソケットの監視を担当します。ソケットが読み取り可能なときにデータを読み取り、プロトコル分析を実行して、リクエストをワーカー プロセスに配信します。ソケットが書き込み可能なときに、TCP クライアントにデータを送信します。

割り当て計算方法は fd % serv->reactor_num

PHP 言語はマルチスレッドをサポートしていないため、Swoole はマルチプロセス モードを使用します。マルチプロセスモードではプロセスメモリ分離があり、作業プロセス内でグローバル変数やスーパーグローバル変数を変更すると、他のプロセスでは無効になります。

worker_num=1 が設定されている場合、プロセス分離は行われず、グローバル変数を使用してデータを保存できます

プロセス分離

$fds = array();
$server->on('connect', function ($server, $fd){
    echo "connection open: {$fd}\n";
    global $fds;
    $fds[] = $fd;
    var_dump($fds);
});

$fds はグローバル変数ですが、現在のプロセス内でのみ有効です。 Swoole サーバーの最下層では複数のワーカー プロセスが作成され、var_dump($fds) に出力される値には接続された fd の一部のみが含まれます。

対応するソリューションは、外部ストレージ サービスを使用することです:

データベース (例: MySQL、MongoDB)
キャッシュ サーバー (例: Redis、 Memcache
複数のプロセスが同時に読み取りおよび書き込みを行う場合は、ディスク ファイルをロックする必要があります。

通常のデータベースおよびディスク ファイルの操作では、IO 待機時間が長くなります。したがって、次の使用をお勧めします。

Redis インメモリ データベース、非常に高速な読み取りおよび書き込み速度
/dev/shm インメモリ ファイル システム、すべての読み取りおよび書き込み操作メモリ内で完了し、IO 消費がなく、パフォーマンスが非常に高い
ストレージの使用に加えて、共有メモリを使用してデータを保存することもできます

推奨される学習: swoole ビデオ チュートリアル

以上がswooleはマルチスレッドをサポートしていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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