POP3, fsockopen, feof

corvus

Guest
POP3, fsockopen, feof

Соединение и залогинивание происходит нормально, получение списка писем тоже.
А вот дальше пытаюсь принять нужное письмо командой
PHP:
fputs ($sock, "RETR ".$num."\r\n" );
$s = "";
while (!feof($sock))
        $s .= trim(fgets($sock, 100));
echo $s;
И ни фига не получается - начинается бесконечное ожидание.
Фишка в том, что даже если написать
PHP:
while (!feof($sock))
        $s .= trim(fgets($sock, $vol));
где $vol - размер письма в байтах, вытащенный из списка писем,
за одно обращение возвращается только одна строка.
В то же время если взять $count, заведомо меньший числа строк в письме
(реальное число строк мы не знаем, поскольку строки имеют разную длину),
то часть письма удаётся получить
PHP:
    for($i = 1 ; $i < $count ; $i++) {
	    $s .= trim(fgets($sock, 100));
      }
В ряде источников рекомендуют установить режим non-blocking командой
socket_set_blocking ($sock, $mode), пробовал $mode и true и false - не помогает.
В других источниках рекомендуют вместо feof() делать так:
PHP:
$meta = stream_get_meta_data ($sock);
while (!$meta['eof'])
       $s .= trim(fgets($sock, 100));
но и так всё тоже самое - висяк ! :-(

Только прошу не отсылать меня к IMAP - должен же быть способ получать письма по РОР3 !?
 

tony2001

TeaM PHPClub
PHP:
while (($data = fread(...)) !== false) {
//do something
}
зачем fgets()? тебе обязательно по строкам читать?
 

mani13

Новичок
Ответы на некоторые команды могут состоять из нескольких строк. В этих случаях каждая строка разделена парой CRLF, а конец ответа заканчивается ASCII символом 46 (".") и парой CRLF.
и в чём проблемы? дожидаешься конца и выходишь из цикла...
 

corvus

Guest
mani13
tony2001

С fread() тоже не проканало - бесконечное ожидание...
Зрабаотало, лишь когда употребил fgetc() !
 

berkut

Новичок
Если Connection: Keep-Alive, то eof не приходит.

у меня тоже много раз были проблемы с fread.
Пишу
$header = fread($sock, 55000);
Приходят не все данные. Заменяю на
while(!feof($sock))
$header.= fgets($sock, 55000);
и всё нормально! Много раз тестил, такая проблема со многими серверами. В чём тут косяк никак не пойму.
И ещё непонятка:
если в соединении
Connection: Keep-Alive
Transfer-Encoding: chunked
то после
while(!feof($sock))
$header.= fgets($sock, 55000);
делаю fputs()
и в ответе ничего, но если делаю fclose($sock);
потом соединяюсь заного, то запрос уходит.
 
Сверху