【发布时间】:2013-04-16 16:48:25
【问题描述】:
我正在学习 PHP 中的套接字编程,所以我正在尝试一个简单的 echo-chat 服务器。
我写了一个服务器,它可以工作。我可以将两个 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():没有传入流数组 /home/user/client.php 第 18 行
但是当我 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 中也需要同样的东西
【问题讨论】:
-
当您将 tv_sec 设置为 1 时,似乎没有显示此警告
-
不,当我将 tv_sec 设置为 1 时,它只会将警告延迟 1 秒...