Чтение данных из fsockopen с использованием fgets / fread hangs

Вот код, который я использую:

if (!($fp = fsockopen('ssl://imap.gmail.com', '993', $errno, $errstr, 15))) echo "Could not connect to host"; $server_response = fread($fp, 256); echo $server_response; fwrite($fp, "C01 CAPABILITY"."\r\n"); while (!feof($fp)) { echo fgets($fp, 256); } 

Я получаю первый ответ:

 OK Gimap ready for requests from xx.xx.xx.xx v3if9968808ibd.15 

но затем страница разрывается. Я просмотрел stream_set_blocking, stream_set_timeout, stream_select, fread и т. Д., Но не смог заставить его работать. Мне нужно прочитать все данные, которые посылает сервер, а затем продолжить работу с другими командами (я получаю электронные письма с помощью imap).

благодаря

Ваш скрипт висит в цикле while в конце. Это потому, что вы использовали !feof() как условие для цикла, и сервер не закрывает соединение. Это означает, что feof() всегда возвращает false и цикл будет продолжаться вечно.

Это не будет проблемой, если вы напишете полную реализацию, так как вы будете искать коды ответов и можете выйти из цикла соответственно, например:

 <?php // Open a socket if (!($fp = fsockopen('ssl://imap.gmail.com', 993, $errno, $errstr, 15))) { die("Could not connect to host"); } // Set timout to 1 second if (!stream_set_timeout($fp, 1)) die("Could not set timeout"); // Fetch first line of response and echo it echo fgets($fp); // Send data to server echo "Writing data..."; fwrite($fp, "C01 CAPABILITY\r\n"); echo " Done\r\n"; // Keep fetching lines until response code is correct while ($line = fgets($fp)) { echo $line; $line = preg_split('/\s+/', $line, 0, PREG_SPLIT_NO_EMPTY); $code = $line[0]; if (strtoupper($code) == 'C01') { break; } } echo "I've finished!"; 

Ваш скрипт должен работать. Фактически, он работает.

Посмотрите результаты ниже на моем компьютере, когда я запустил ваш код:

 * OK Gimap ready for requests from xx.xx.xx.xx l5if4585958ebb.20 * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH C01 OK Thats all she wrote! l5if4585958ebb.20 

Поскольку gmail не отключает вас. Никакого конца файла не происходит. И загрузка страницы просто время от времени.

Другими словами: ваш скрипт будет просто ждать и ждать, пока gmail не отключится, что, к сожалению, произойдет после того, как загрузка страницы уже отключена.