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

Решение

Увидеть:

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

На: feof

Обходной путь по существу ждет default_socket_timeout и затем завершает цикл while.

2

Другие решения

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

1

По вопросам рекламы [email protected]