【问题标题】:How to reset a Guzzle client and clear any cached values (memory usage)如何重置 Guzzle 客户端并清除所有缓存值(内存使用情况)
【发布时间】:2015-04-10 04:58:40
【问题描述】:

我有类似于下面的代码(它是示例代码)。使用 Guzzle,我多次调用同一站点以查看文档是否存在。如果文档存在,我保存它。当我每次打电话时,内存使用量都会增加。最终,如果请求的数量足够多,我就会耗尽内存。我使用memory_get_peak_usage 来跟踪内存使用发生的位置,它是 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 ) {

        }
    }

【问题讨论】:

  • 您仅限使用 Guzzle v3 还是可以使用 v5?引擎盖下进行了一些重大的架构更改。在 v4 和 v5 中
  • 根本没想过要检查它。 Guzzle 是通过packagist.org/packages/misd/guzzle-bundle 添加的,所以我得花点时间看看我们是否可以升级。但这给了我一个开始寻找的地方。谢谢。
  • 跟进我最初的问题,您的错误是否在 Symfony 框架应用程序的上下文中出现?您的问题是否可以从测试应用程序中重现(例如您的代码示例)?另外,什么是 $this->filesystem?它是 Symfony\Component\Filesystem 的一个实例吗?
  • 我能够回答我自己的问题。 $filesystem->put() 方法实际上似乎表明使用了 phpleague/flysystem。
  • 别让你挂了:文件系统确实是thephpleague/flysystem

标签: php guzzle


【解决方案1】:

基于对捆绑包源代码的粗略浏览,Guzzle 客户端正在使用 Doctrine 的文件系统缓存。参考资料:

Bundle 文档还提供了有关Caching 的信息。因此,理论上要删除/禁用缓存,您所要做的就是从 MyBundle/Resources/config/services.xml 的 addSubscriber 部分删除对 &lt;argument type="service" id="misd_guzzle.cache.filesystem"/&gt; 的引用

【讨论】:

  • 我不知道这在我们的例子中是否属实,因为我们没有在该服务器中启用缓存;如果我继续遇到其他问题,我会追踪它。
  • 但是你对这个版本很满意。我们删除了misd/guzzle-bundle' from the project, and added guzzlehttp/guzzle`。这意味着对代码进行了一些更改以处理不同的类和异常,但重新运行代码不会导致同一测试用例出现错误。
  • 我正在使用 Guzzle 6 并注意到每个 ->get I do 消耗接近 2MB 的内存。我立即使用响应,所以有没有办法“清除”缓存并重新获得使用的内存?
猜你喜欢
  • 2011-11-08
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
相关资源
最近更新 更多