socket_select
指定されたタイムアウトソケットアレイでselect()システムコールを実行します
関数名:socket_select()
適用バージョン:PHP 4> = 4.3.0、PHP 5、PHP 7
関数の説明:Socket_Select()関数は、特定のソケットセットでI/O操作をマルチプレックスブロックするために使用されます。複数のソケットを同時に監視して、どのソケットが入力、出力、または例外イベントが発生しているかを判断できます。この関数は、オペレーティングシステムが提供する選択システム呼び出しに基づいて実装されます。
構文:int socket_select(array&$ read、array&$ write、array&$を除き、int $ tv_sec [、int $ tv_usec = 0])
パラメーター:
返品値:
例:
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_bind($serverSocket, '127.0.0.1', 8888); socket_listen($serverSocket); $clientSockets = array($serverSocket); $write = $except = array(); while (true) { $read = $clientSockets; // 用于监视读事件的socket数组// 使用socket_select()等待事件发生if (socket_select($read, $write, $except, 0) < 1) { continue; } // 检查是否有新的客户端连接if (in_array($serverSocket, $read)) { $clientSocket = socket_accept($serverSocket); $clientSockets[] = $clientSocket; echo "New client connected." . PHP_EOL; // 从读事件数组中移除服务器socket $key = array_search($serverSocket, $read); unset($read[$key]); } // 处理已连接的客户端发送的数据foreach ($read as $clientSocket) { $data = socket_read($clientSocket, 1024); if ($data === false) { // 客户端断开连接$key = array_search($clientSocket, $clientSockets); unset($clientSockets[$key]); socket_close($clientSocket); echo "Client disconnected." . PHP_EOL; } else { // 处理客户端发送的数据echo "Received data: " . $data . PHP_EOL; } } } // 关闭服务器socket socket_close($serverSocket);
上記の例は、Socket_Select()関数を使用して多重化を実装する単純なTCPサーバーを示しています。ループでは、Socket_Select()を介してイベントが発生するのを待ち、次に、新しいクライアント接続、クライアントの切断、クライアントが送信したデータの受信など、返品結果に応じてさまざまな状況を処理します。この方法では、単一のスレッドで複数のクライアント接続を同時に処理することができ、サーバーのパフォーマンスと同時処理機能が向上します。