ここにリストされているphpドキュメントには、関数が読み取り、エラー、および書き込みの配列値を参照として使用していることが示されていますが、これらの値で実際に何が変更されているかを見つけることができませんでした。
私が現在使用している単純な「サーバー」を書きましたが、前述の関数がポーリングされたクライアントでデータを確認できない場合、配列が変更され、再度ポーリングするために使用できなくなることに気付きました。これは私のコードです:
<php - all socket creation binding and listening above..
socket_set_nonblock($mysock);
$w = $e = array();
$clients = array($mysock);
do {
$temp_client = @socket_accept($mysock);
if ($temp_client != FALSE)
$clients[] = $temp_client;
$clients_backup = $clients;
$select_socket = socket_select($clients,$w,$e,0);
if (($select_socket !== FALSE) AND ($select_socket != 0)) {
foreach ($clients as $value) {
$input = socket_read($value,1024,PHP_BINARY_READ);
echo $input;
}
}
$clients = $clients_backup;
} while(TRUE);
これをテストするとき、最初の接続が処理されていないことを考慮してください..なぜこのコードが私が開発しているもののストリップであり、そこで正常に動作するのかわかりません(elightmentに非常に感謝します)。socket_select の問題は、両方のコードで同じままです。
基本的に、クライアント アレイのバックアップを作成しないと機能しません。エラー: "no resource arrays were passed to select" は、socket_select が最初に読み取るデータのない接続をチェックした後、配列にソケット リソースがないために表示されます。