Прерывистое предупреждение PHP: «imap_open (): не удалось открыть поток» - PullRequest
0 голосов
/ 07 мая 2019

У меня есть задание cron, которое извлекает электронные письма из учетной записи gmail каждые 5 минут. Я использую библиотеку ddboer / imap для аутентификации, и время от времени (примерно раз в 2-3 дня) возникает проблема с подключением.

Мой код довольно прост и выглядит примерно так:

$server = new Server('imap.gmail.com');

try {
    $connection = $server->authenticate($username, $password);
} catch (Exception $e) {
    echo $e->getMessage();
}

Выход при сбое:

[E_WARNING] Authentication failed for user "user@example.com": imap_open(): Couldn't open stream {imap.gmail.com:993/imap/ssl/validate-cert}
imap_alerts (0):
imap_errors (1):
- Can not authenticate to IMAP server: [CLOSED] IMAP connection broken (authenticate)

Устранение неполадок было очень трудным, поскольку проблема носит прерывистый характер. Следующие общие проблемы уже решены:

Здесь важно отметить, что сценарий успешно выполняется в 99% случаев и дает сбой только изредка, но это происходит достаточно регулярно, чтобы вызвать этот вопрос.

1 Ответ

3 голосов
/ 07 мая 2019

Учитывая, что:

  • ваш код почти всегда работает
  • вы подключаетесь к серверу, который не можете контролировать
  • этот сервер может быть тысячкилометров, с десятками сетей между вами

Я бы просто согласился, что иногда случается $ # i †, и убедитесь, что вы готовы к этому:

$server = new Server('imap.gmail.com');

$retries = -1;
while (true) {
    try {
        $connection = $server->authenticate($username, $password);
        break;
    } catch (Exception $e) {
        if ($retries++ > 2) {
            echo $e->getMessage();
            break;
        }
        sleep(pow(2, $retries));
    }
}

Таким образом, в случае ошибки, это будет повторяться через 1 секунду, затем повторяться через 2 секунды, затем повторяться через 4 секунды, прежде чем сдаться.Настройте эти пороги по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...