リアクター スレッド
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 サイトの他の関連記事を参照してください。