2015-10-17 1 views
0

Попытки выполнить следующий код с жрать 5.жрать отправить() метод вызывает Curl ошибку 35 Слишком много открытых файлов

$client = new GuzzleClient(['defaults/headers/User-Agent' => static::$userAgentString]); 

$request = $client->createRequest(static::$serviceRequestMethod, $url, $options); // Create signing request. 

$signature = new Signature\Signature($this->accessKey, $this->secretKey); 

$options = array_merge_recursive($options, ['query' => ['Signature' => $signature->signString($hash)]]); 

$request = $client->createRequest(static::$serviceRequestMethod, $url, $options); // Create real request. 

$response = $client->send($request); 

Когда я называю эту линию достаточно времени на длительном процессе CLI бегового, я получаю следующая ошибка восходит к линии $response = $client->send($request);

cURL error 35: error:02001018:system library:fopen:Too many open files 

После этого хитов, каждый веб-страница и команды на сервере срываются с той же ошибкой «слишком много открытых файлов».

Вот трассировки стека:

#0 /home/vagrant/code/example.com/vendor/guzzlehttp/guzzle/src/RequestFsm.php(104): GuzzleHttp\Exception\RequestException::wrapException(Object(GuzzleHttp\Message\Request), Object(GuzzleHttp\Ring\Exception\ConnectException)) 
#1 /home/vagrant/code/example.com/vendor/guzzlehttp/guzzle/src/RequestFsm.php(132): GuzzleHttp\RequestFsm->__invoke(Object(GuzzleHttp\Transaction)) 
#2 /home/vagrant/code/example.com/vendor/react/promise/src/FulfilledPromise.php(25): GuzzleHttp\RequestFsm->GuzzleHttp\{closure}(Array) 
#3 /home/vagrant/code/example.com/vendor/guzzlehttp/ringphp/src/Future/CompletedFutureValue.php(55): React\Promise\FulfilledPromise->then(Object(Closure), NULL, NULL) 
#4 /home/vagrant/code/example.com/vendor/guzzlehttp/guzzle/src/Message/FutureResponse.php(43): GuzzleHttp\Ring\Future\CompletedFutureValue->then(Object(Closure), NULL, NULL) 
#5 /home/vagrant/code/example.com/vendor/guzzlehttp/guzzle/src/RequestFsm.php(135): GuzzleHttp\Message\FutureResponse::proxy(Object(GuzzleHttp\Ring\Future\CompletedFutureArray), Object(Closure)) 
#6 /home/vagrant/code/example.com/vendor/guzzlehttp/guzzle/src/Client.php(165): GuzzleHttp\RequestFsm->__invoke(Object(GuzzleHttp\Transaction)) 
#7 /home/vagrant/code/example.com/app/library/amazon/src/AWS.php(540): GuzzleHttp\Client->send(Object(GuzzleHttp\Message\Request)) 

Я не знаю ни необходимости явно закрывать ресурс после отправки запроса через жрать. Я что-то упустил, или это может быть ошибкой в ​​Гузле?

+0

Можете ли вы определить «достаточно времени»? Как долго работает процесс? По собственному упущению это звучит так, будто вы нажимаете один из пределов PHP. Сколько из ваших запросов вы пытаетесь выполнить параллельно? Является ли GuzzleHttp \ Pool жизнеспособным вариантом для вас? –

+0

@ShaunBramley Должно быть более конкретным в том, что «достаточно времени» варьируется в 5000+ запросов на получение/отправку из этого сценария и работает от 2 минут до 2 часов в зависимости от количества записей в очереди. Ни один из них не выполняется параллельно. Каждый из них выполняется последовательно из-за кода, который зависит от него. – eComEvo

+0

Является ли обновление до Guzzle 6 вариантом для вас? –

ответ

1

Это не проблема с Guzzle или MailGun, насколько это возможно с вашей конкретной реализацией библиотек. Фактически вы нажимаете границы базовой операционной системы (libcurl, openssl и fopen), имея так много длинных (открытых) запросов.

Согласно ошибке libcurl errors ошибка 35 указывает на то, что с помощью SSL/TLS была достигнута ошибка.

В соответствии с различными ошибками ссылок google: 02001018 является признаком того, что openssl не смог получить доступ (или, скорее, читать) файл сертификата.

Вы можете использовать ulimit для просмотра и изменения пределов различных общесистемных ресурсов.

Вы также можете использовать lsof, чтобы просмотреть открытые файлы.

Чтобы решить проблему:

  1. (если это возможно) резервов увеличения системных ресурсов - обязательно исследовать последствия, которые эти изменения могут иметь.
  2. Рефакторинг вашего кода, чтобы вы не попадали в пределы операционной среды. Возможно, я могу использовать асинхронную связь для некоторых запросов. Другая библиотека, или, возможно, «сбрасывание» и реализация ваших собственных.
  3. Найдите способ реализации определенного ограничения скорости (я перечислил это отдельно от # 2), но они могут идти рука об руку.
Смежные вопросы