2

ここにリストされている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 が最初に読み取るデータのない接続をチェックした後、配列にソケット リソースがないために表示されます。

4

1 に答える 1

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
于 2012-04-23T17:31:16.030 に答える