fsockopen - 如何检测消息结束?

时间:2015-01-20 16:47:43

标签: php sockets pop3 fsockopen

我有代码:

$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客户端知道何时停止接收。

2 个答案:

答案 0 :(得分:2)

请参阅:

  

警告如果服务器未关闭fsockopen()打开的连接,则feof()将挂起。要解决此问题,请参阅以下示例:

开:feof

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

答案 1 :(得分:1)

Sockets可以为处理超时/挂起提供更好的替代方案。