2012-04-23 31 views
2

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」というエラーが表示されます。

答えて

4

これらの配列はソケットリソースの配列です。 socket_select()は、読み込み、書き込みなどの準備ができていないリソースをすべて削除して配列を変更します。

あなたは、ほとんどの場合、彼らが変更されるので、コピーあなたの配列のそれを渡したいと思うでしょう、そしてあなたは彼らにあなたの元の参照を失いたくない:

$clients = [ ... ]; 
$r = $w = $e = $clients; 

$numChanged = socket_select($r, $w, $e, ...); 

// Here, $r, $w, and $e will only contain the resources that are ready for processing, which may be none at all 
+0

はあなたがいることを見たことがありますどこかに網羅的に文書化された配列を取り除く? 私はそれが理にかなっていると思うので、あなたは先に進み、ブロックせずにクライアントをforeachすることができます – quinestor

+1

@quinestor:はい、それは[マニュアル](http://us3.php.net /manual/en/function.socket-select.php)。 ;-) – FtDRbwLXw6

+0

hmmm私はそれが "あなたが18歳以上ならば"という標準だと思った;) – quinestor