2015-04-08 4 views
3

У меня есть код, похожий на то, что ниже (это пример кода). Используя Guzzle, я делаю несколько вызовов на одном сайте, чтобы узнать, существует ли документ. Если документ существует, я сохраняю его. Когда я делаю каждый звонок, использование памяти увеличивается. В конце концов, если количество запросов достаточно велико, у меня заканчивается память. Я использовал memory_get_peak_usage для отслеживания использования памяти, и это клиент Guzzle.Как сбросить клиент Guzzle и очистить кешированные значения (использование памяти)

Код работает, как ожидалось, но я не могу найти способ сообщить клиенту Guzzle «сбросить и сбросить все предыдущие запросы». Я уверен, что он кэширует результаты в памяти, но, как я написал их в файл, я знаю, что мне не нужны указанные результаты. Как сбросить их?

FWIW, мое текущее решение создает новый клиент, дублирующий параметры исходного и периодически отменяя его. Он работает, но он уродлив.

$client = new \Guzzle\Http\Client('some_url'); 
    for ($i=0; $i<10000; $i++) 
    { 
     try { 
      $pdf = $client->get($pdf_name)->send(); 
      $this->filesystem->put(
       $pdf_name, 
       $pdf->getBody(true) 
      ); 
     } catch (ClientErrorResponseException $ex) { 

     } 
    } 
+0

Вы ограничены использованием Guzzle v3 или можете ли вы использовать v5? Были некоторые значительные архитектурные изменения, сделанные под капотом. в v4 и v5 –

+0

Даже не подумал проверить. Guzzle добавляется через https://packagist.org/packages/misd/guzzle-bundle, поэтому мне нужно будет поработать, если мы сможем обновиться. Но это дает мне возможность начать искать. Благодарю. –

+0

Чтобы следить за моим оригинальным вопросом, ваша ошибка проявляется в контексте приложения Symfony Framework? Являются ли ваши проблемы воспроизводимыми из тестового приложения (например, ваш образец кода)? Кроме того, что такое $ this-> файловая система? Является ли это экземпляром Symfony \ Component \ Filesystem? –

ответ

2

Основываясь на cursorary взгляд на исходный код для пучка клиент жрать делает использование кэш файловой системы Доктрины в. Ссылки:

Документация Bundle также предоставляет информацию о Caching. Итак, в теории, чтобы удалить/отключить кеш, все, что вам нужно сделать, это удалить ссылку на <argument type="service" id="misd_guzzle.cache.filesystem"/> из раздела addSubscriber вашего MyBundle/Resources/config/services.xml

+0

Я не знаю, верно ли это в нашем случае, потому что у нас нет кэша, который включен на этом сервере; это то, что я выслежу, если у меня будут другие проблемы. –

+0

Но у вас была ошибка с версией. Мы удалили 'misd/guzzle-bundle 'из проекта и добавили' guzzlehttp/guzzle'. Это означало несколько изменений в коде для обработки разных классов и исключений, но повторный запуск кода не приводил к ошибкам для одного и того же теста. –

+0

Я использую Guzzle 6 и замечаю, что каждый -> get I do потребляет около 2 МБ памяти. Я сразу использую ответ, так что есть способ «очистить» кеш и вернуть использованную память? – Vallieres