我在PHP中使用流式套接字从远程服务器读取.当远程服务器在连接后消失时,stream_select继续在流的读取部分上显示已更改的流,但正在读入的数据是空字符串.
这是一个重现错误的小案例.它是两个组件,服务器和客户端组件.
为了复制该bug,您需要从命令行使用php执行以下操作:
1.启动server.php
2.启动client.php
此时服务器应显示"按返回继续....或CTRL-C",客户端应显示"杀死您的服务器".按返回继续....'
此时您应该看到来自client.php的调试输出显示问题(您将非常快速地想要ctrl-c,它会非常快速地打印大量重复信息)
我不确定为什么在服务器组件不再运行之后,stream_select继续将读取流显示为具有更改.
server.php
<?php
$socket = stream_socket_server("tcp://0.0.0.0:51111", $errno, $errstr);
$s = stream_socket_accept($socket);
print("Press return to continue.... or CTRL-C me");
fread(STDIN,1); // Wait for one character to be pressed.
fwrite($s, "Yep here's some stuff for you\0");
?>
Run Code Online (Sandbox Code Playgroud)
client.php
<?php
$url = "localhost";
$port = 51111;
$errno = 0;
$errstr = "";
$fp = @stream_socket_client("tcp://".$url.":".$port, $errno, $errstr, 5);
if (!$fp)
{
print( "Unable to open socket: $errstr ($errno)\n" );
throw new Exception( "Unable …Run Code Online (Sandbox Code Playgroud)