4

我是用户而不是开发人员。开发人员不可用。

这是 Google 购物产品提交脚本中使用的 Google API 库。

脚本每 20 分钟成功运行 2 年 + 昨天的前 5 个小时。

然后出现以下错误:

[18-Apr-2020 06:20:03 Europe/London] PHP Fatal error:  Uncaught GuzzleHttp\Exception\RequestException: cURL error 2: easy handle already used in multi handle (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) in ../vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:162
Stack trace:
#0 ../vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(129): GuzzleHttp\Handler\CurlFactory::createRejection(Object(GuzzleHttp\Handler\EasyHandle), Array)
#1 ../vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(89): GuzzleHttp\Handler\CurlFactory::finishError(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#2 ../vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php(43): GuzzleHttp\Handler\CurlFactory::finish(ThObject(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#3 ../vendor/guzzlehttp/guzzle/src/Handl in ../vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php on line 162

脚本停止工作时唯一的服务器更改是应用到物理主机的安全补丁和服务器重新启动。

PHP v7.3.16

我相信使用的谷歌库是 v2.0

我可以按照说明进行操作,但可能不会理解它们!

TIA

4

5 回答 5

8

以防万一读到这篇文章的人正在使用 Laravel。几天前我们突然开始遇到同样的问题,尝试安装不同的 cURL 版本并设置 cURL 选项,但没有任何效果。我通过更改 vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php 文件来修复它。寻找写着的那一行

if (count($this->handles) >= $this->maxHandles) {
curl_close($resource);
} else {
...
}

把这一切都注释掉,而不是 if/else 只写

curl_close($resource);

换句话说,无论句柄数是多少,您总是关闭 cURL 连接。这对我们立即起作用!

希望能帮助到你 :)

于 2020-04-20T01:44:11.560 回答
1

我们昨天与 Stripe 工程师一起解决了这个问题(这并不是说您的问题与 Stripe 相关,不是,但问题/解决方案应该是相同的)

(这些发现不是 100% 确认的,但似乎是模式):它是通过 cURL 发出 2+ 个请求时引起的,并且似乎发生在 cURL 的最新版本之一或至少其他一些软件(可能已经更新自动或由您的托管服务提供商完成)

我们提供的解决方案是禁用 cURL 中的持久连接。根据您的实施,有不同的方法可以做到这一点。但是为了获得灵感,这就是我们使用 Stripe 的方式:

$curl = new \Stripe\HttpClient\CurlClient();
$curl->setEnablePersistentConnections(false);
\Stripe\ApiRequestor::setHttpClient($curl);

我想对于您的图书馆来说,这将与此类似。对于那些希望为 Stripe 解决这个问题的人来说,这里是 :)

注意:这个解决方案理论上会对延迟产生影响,但是我们在实践中还没有经历过。但现在它被提到了:)

于 2020-04-18T07:09:36.133 回答
0

我已经恢复到 curl 7.69.1 并且一切都很好。现在,我已经从 yum 中删除了 curl + libcurl,所以它们不会更新。感谢您的帮助和建议,如果我的风格不正确,我们深表歉意。

于 2020-04-18T14:07:05.490 回答
0

public_html/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php

请从此 fn 中评论这些行

公共静态函数 wrapSync( 可调用 $default, 可调用 $sync ) {

    // return function (RequestInterface $request, array $options) use ($default, $sync) {
    //     return empty($options[RequestOptions::SYNCHRONOUS])
    //         ? $default($request, $options)
    //         : $sync($request, $options);
    // };

}

于 2020-04-27T10:18:08.897 回答
0

我没有使用 guzzle,但我对其他库也有同样的问题

php 7.4.6

卷曲 7.19.7

CentOS 6.10 版(最终版)

包“mercadopago/dx-php”:“2.0.0”

在我的开发服务器和我测试过的其他服务器上它工作正常

我不是 100%,但我认为这是 curl 库上的一个错误,它不允许为多个请求重用相同的 curl 连接(我再次不确定)。

我用 mercadopago/dx-php 上的修补程序解决了它 我编辑了 ./vendor/mercadopago/dx-php/src/MercadoPago/RestClient.php

替换第 150 行

从 $connect = $this->getHttpRequest();

到 $connect = new Http\CurlRequest();

换句话说,强制为下一个请求使用新连接。在您的代码中查看重用连接的位置并尝试创建新连接。

我知道,这很糟糕,因为: - 是第三方的修补程序 - 不能重用相同的连接

但它奏效了。希望它可以帮助你。

于 2020-06-06T18:42:23.663 回答