Отлов ошибок cURL из Guzzle

У меня есть следующий код, который делает запрос Guzzle 4.1:

$client = new \GuzzleHttp\Client(['defaults/headers/User-Agent' => $userAgentString]);

$retry = 0;

do {
    try {
        return $client->post($url, $options);
    } catch (\Exception $e) {
        echo $e->getMessage();
        $retry++;
        continue;
    }
} while ($retry < 3);

Он успешно работает в течение довольно долгого времени, но через случайные промежутки времени у него иногда возникают проблемы с файлом CA cURL, что вызывает фатальную ошибку из-за неперехваченного исключения. Я не уверен, что смогу это сделать, потому что он уже есть в блоке try catch.

Вот ошибка, которая отключает мою консольную команду Laravel:

cURL error 77: error setting certificate verify locations:
  CAfile: /home/vagrant/Projects/test.dev/laravel/vendor/guzzlehttp/guzzle/src/cacert.pem
  CApath: /etc/ssl/certs (0)
PHP Fatal error:  Uncaught exception 'ErrorException' with message 'include(/home/vagrant/Projects/test.dev/laravel/vendor/filp/whoops/src/Whoops/Exception/Inspector.php): failed to open stream: Too many open files' in /home/vagrant/Projects/test.dev/laravel/vendor/composer/ClassLoader.php:382

Что я хотел бы сделать, так это не только выяснить, почему Guzzle получает эту ошибку cURL, но и как я могу ее поймать, если она возникает в других системах, в которых есть эта проблема с cURL, чтобы это не просто привело к сбою процесса.


person eComEvo    schedule 21.10.2014    source источник
comment
failed to open stream: Too many open files' тоже не очень хорошо выглядит. сколько файлов вы пытаетесь использовать в этом скрипте?   -  person Marc B    schedule 22.10.2014
comment
Только один. Этот скрипт выводит на консоль с помощью компонента консоли Symfony. Я заметил, что это довольно плохо при закрытии дескрипторов процессов, и, несмотря на реализацию кода для очистки после него, я все еще сталкиваюсь с этой проблемой, если на консоль выводится длинная строка прогрессивных выходных данных.   -  person eComEvo    schedule 22.10.2014
comment
@eComEvo У меня та же проблема, где вы можете найти решение?   -  person Vlad Vinnikov    schedule 21.01.2015
comment
@VladVinnikov К сожалению, не для отлова ошибок cURL. Кажется, это происходит только в моей бродячей установке Homestead, это было то, что я должен был просто игнорировать, учитывая, что его не было в производстве. Опубликую, если найду обходной путь. Единственный обходной путь, который я смог найти для проблемы too many open files, заключался в том, чтобы заменить использование методов консоли Symfony на простое использование echo для отображения вывода на консоль.   -  person eComEvo    schedule 21.01.2015
comment
@eComEvo Я решил, что проблема у меня была в очереди ремесленников. Я переключил его на Redis, и теперь все работает. Каждая работа, вероятно, имеет предел завитков   -  person Vlad Vinnikov    schedule 22.01.2015
comment
@VladVinnikov Это действительно может быть причиной! Я только что понял, что производственный сервер использует Redis, а для моего Homestead установлено значение file. Проверю снова позже, когда в следующий раз мне нужно будет запустить эту команду.   -  person eComEvo    schedule 22.01.2015