2015-01-20 2 views
1

У меня есть код:fsockopen - как определить конец сообщения?

$f = fsockopen('mail.myserver.com', 110); //POP3 
echo fgets($f, 4096) . '<hr>'; 
fputs($f, "USER [email protected]\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 знают, когда прекратить получать.

+1

Вы всегда можете использовать (http://php.net/manual/en/book.imap.php). –

+0

@ PawełMalisak: Я не могу, это довольно редкое расширение и недоступно на моем сервере. – Tom

ответ

2

См:

Предупреждение Если соединение открыто fsockopen() не было закрыто сервером, feof() будет висеть. Чтобы обойти это, например, смотри ниже:

В: feof

Чтобы обойти эту проблему, по существу ожидает default_socket_timeout и затем завершает While-цикл.

+0

Но как клиенты telnet знают, когда сообщение будет завершено? – Tom

+1

Я предполагаю, что telnet обнаруживает 'eof'? – Halcyon

1

Sockets может предоставить лучшую альтернативу обработке тайм-аутов/зависаний.

Смежные вопросы