fsockopen - 如何检测消息结束?

fsockopen - how to detect end of message?

我有代码:

$f = fsockopen('mail.myserver.com', 110); //POP3
echo fgets($f, 4096) . '<hr>';
fputs($f, "USER login@myserver.com\r\n");
echo fgets($f) . '<br>';
fputs($f, "PASS mypass\r\n");
echo fgets($f) . '<br>';
fputs($f, "LIST\r\n");
echo fgets($f) . '<br>';
fputs($f, "RETR 1\r\n");

到目前为止一切顺利,但我有一个循环来接收整个消息:

while (!feof($f)) 
{
echo fgets($f, 1280);
}

这需要很长时间,因为脚本会等待超时开始——它从不自己检测 EOF。

如何检测 EOF 并在超时前中断循环?如果我使用 telnet,那么一切正常——telnet 客户端以某种方式知道何时停止接收。

参见:

Warning If a connection opened by fsockopen() wasn't closed by the server, feof() will hang. To workaround this, see below example:

开启:feof

解决方法本质上是等待 default_socket_timeout,然后终止 while 循环。

Sockets 可能提供更好的替代方法来处理 timeouts/hangs.