PHPドキュメントのhereには、関数がread、error、writeの配列の値を参考として使用していますが、実際に値が変更された場所を見つけることができませんでした。Socket_select:入力には影響しますが、正確にはどのように影響しますか?
私は今使っているシンプルな「サーバー」を書いていますが、上記の関数がポーリングされたクライアント上のデータを見ることができない場合、配列を変更してポーリングを再利用できないようにします。これは私のコードです:
<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の問題は、両方のコードで同じです。
基本的に私がクライアントアレイのバックアップを作成しないと、動作しません。 socket_selectが読み込みデータのない接続を最初にチェックした後に、配列にソケットリソースがないため、「no resource arrays was select to passed」というエラーが表示されます。
はあなたがいることを見たことがありますどこかに網羅的に文書化された配列を取り除く? 私はそれが理にかなっていると思うので、あなたは先に進み、ブロックせずにクライアントをforeachすることができます – quinestor
@quinestor:はい、それは[マニュアル](http://us3.php.net /manual/en/function.socket-select.php)。 ;-) – FtDRbwLXw6
hmmm私はそれが "あなたが18歳以上ならば"という標準だと思った;) – quinestor