У меня есть код:
$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 знают, когда прекратить получать.
Увидеть:
Предупреждение Если соединение, открытое с помощью fsockopen (), не было закрыто сервером, feof () зависнет. Чтобы обойти это, см. Пример ниже:
На: feof
Обходной путь по существу ждет default_socket_timeout
и затем завершает цикл while.
Розетки может предоставить лучшую альтернативу обработке тайм-аутов / зависаний.