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

8

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

<code>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);
}
</code>

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

<code>OK Gimap ready for requests from xx.xx.xx.xx v3if9968808ibd.15 
</code>

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

Спасибо

Да. Я проверил это, заменив цикл while простым написанием fgets ($ fp, 256) два раза. И вот ответ, который я получаю: * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST ДЕТИ X-GM-EXT-1 XYZZY SASL-IR AUTH = XOAUTH C01 OK victor_golf
Вы уверены, что ответ только 256 символов? И Вы уверены, что сокет доступен для записи? Возможно твой скрипт висит наfwrite() из-за сокета не записывается ... shadyyx

Ваш Ответ

2   ответа
8

что вы использовали!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!";
Да. Я проходил через эти команды в течение некоторого времени. Еще раз спасибо. victor_golf
RFCs are your friends ;-) (Не забудьте также обработать ответы об ошибках, иначе ваш скрипт будет зависать вечно, ожидаяC01 ответа он никогда не получит)
Благодарю. Теперь мне просто нужно выяснить коды ответов для других команд ... victor_golf
1

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

* 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 отключится, что, к сожалению, происходит после того, как время загрузки вашей страницы уже истекло.

Возможно, проблема в том, что вы пытаетесь запустить его с веб-страницы, я прав? Время ожидания страницы истекает до отключения gmail (поэтому функция feof () никогда не возвращает true). Вероятно, он теряет часть буфера в процессе тайм-аута.
Ваш код работает. Вы должны искать этот C01 OK вместо ожидания конца файла
Я получаю следующий ответ, но через 2 минуты после загрузки страницы: * OK Gimap готов к запросам от xx.xx.xx.xx vb10if10168308icb.24 * CAPABILITY IMAP4rev1 НЕ ВЫБРАННЫЙ IDLE ИМЯ ПРОГРАММЫ QUOTA ID XLIST ДЕТИ X-GM-EXT-1 XYZZY SASL- IR AUTH = XOAUTH C01 OK Вот и все, что она написала! vb10if10168308icb.24 Как я могу справиться с тайм-аутом, так как stream_set_timeout ($ fp, 1), похоже, не работает .. victor_golf
Получили ли вы результат немедленно или потребовалось некоторое время (1-2 минуты) для тайм-аута? victor_golf
Да. У меня есть страница .php с этим кодом. В чем проблема? victor_golf

Похожие вопросы