3

PHPでソケットプログラミングを学んでいるので、単純なエコーチャットサーバーを試しています。

サーバーを作成しましたが、動作します。2 つの netcat を接続でき、一方の netcat に書き込むと、もう一方の netcat で受信します。今、私はNCがPHPで行うことを実装したい

stream_select を使用して、STDIN またはソケットにデータがあるかどうかを確認し、STDIN からサーバーにメッセージを送信するか、サーバーからの受信メッセージを読み取ります。残念ながら、php マニュアルの例では、その方法についての手がかりが得られません。私は単純に $line = fgets(STDIN) と socket_write($socket, $line) を試みましたが、うまくいきません。だから私は降り始め、ユーザーがメッセージを入力したときに stream_select が動作するようにしたいだけです。

$read = array(STDIN);
$write = NULL;
$exept = NULL;

while(1){

    if(stream_select($read, $write, $exept, 0) > 0)
        echo 'read';
}

与える

PHP 警告: stream_select(): 18 行目の /home/user/client.php にストリーム配列が渡されませんでした

しかし、var_dump($read) を実行すると、ストリームを持つ配列であることがわかります。

array(1) {
  [0]=>
  resource(1) of type (stream)
}

stream_select を機能させるにはどうすればよいですか?


PS:Pythonでは、次のようなことができます

r,w,e = select.select([sys.stdin, sock.fd], [],[])
for input in r:
    if input == sys.stdin:
        #having input on stdin, we can read it now
    if input == sock.fd
        #there is input on socket, lets read it

PHPでも同じことが必要です

4

1 に答える 1