PHP Fatal error: Uncaught GuzzleHttp\Exception\RequestException: cURL error 2: easy handle already used in multi handle
PHP Fatal error: Uncaught GuzzleHttp\Exception\RequestException: cURL error 2: easy handle already used in multi handle
我是用户,不是开发者。开发人员不可用。
这是 Google API 库,用于 Google 购物产品提交脚本。
脚本成功运行,每 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
我相信正在使用的 Google 库是 v2.0
我可以按照说明进行操作,尽管可能不理解它们!
TIA
我们昨天和Stripe的工程师一起解决了这个问题(不是说你的问题是Stripe相关的,不是,但是problem/solution应该是一样的)
(这些发现并未 100% 得到证实,但似乎是一种模式):它是在通过 cURL 发出 2+ 次请求时引起的,并且似乎是自最新版本的 cURL 之一或至少是其他一些软件以来发生的(可能已自动更新或由您的托管服务提供商完成)
我们得到的解决方案是禁用 cURL 中的持久连接。根据您的实施情况,您可以采用不同的方式来做到这一点。但为了获得灵感,这就是我们使用 Stripe 的方式:
$curl = new \Stripe\HttpClient\CurlClient();
$curl->setEnablePersistentConnections(false);
\Stripe\ApiRequestor::setHttpClient($curl);
我想对于您的图书馆来说,这与此类似。对于那些希望为 Stripe 解决这个问题的人,这里是 :)
注意:该方案理论上会对延迟产生影响,但我们尚未在实践中体验到这一点。但是现在提到了:)
我已经恢复到 curl 7.69.1 并且一切正常。
现在,我已经从 yum 中删除了 curl + libcurl,所以它们不会更新。
感谢您的帮助和建议,如果我的风格不正确,我们深表歉意。
以防万一阅读本文的人正在使用 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 连接。这对我们来说立竿见影!
希望对您有所帮助:)
public_html/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php
请评论此 fn 中的这些行
public 静态函数 wrapSync(
可调用 $default,
可调用 $sync
) {
// return function (RequestInterface $request, array $options) use ($default, $sync) {
// return empty($options[RequestOptions::SYNCHRONOUS])
// ? $default($request, $options)
// : $sync($request, $options);
// };
}
我没有使用 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();
换句话说,下一个请求强制使用新的连接。在您的代码中查看重用连接的位置并尝试创建新连接。
我知道,这很糟糕,因为:
- 是第三方的修补程序
- 不能重复使用相同的连接
但它奏效了。希望对你有帮助。
我是用户,不是开发者。开发人员不可用。
这是 Google API 库,用于 Google 购物产品提交脚本。
脚本成功运行,每 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
我相信正在使用的 Google 库是 v2.0
我可以按照说明进行操作,尽管可能不理解它们!
TIA
我们昨天和Stripe的工程师一起解决了这个问题(不是说你的问题是Stripe相关的,不是,但是problem/solution应该是一样的)
(这些发现并未 100% 得到证实,但似乎是一种模式):它是在通过 cURL 发出 2+ 次请求时引起的,并且似乎是自最新版本的 cURL 之一或至少是其他一些软件以来发生的(可能已自动更新或由您的托管服务提供商完成)
我们得到的解决方案是禁用 cURL 中的持久连接。根据您的实施情况,您可以采用不同的方式来做到这一点。但为了获得灵感,这就是我们使用 Stripe 的方式:
$curl = new \Stripe\HttpClient\CurlClient();
$curl->setEnablePersistentConnections(false);
\Stripe\ApiRequestor::setHttpClient($curl);
我想对于您的图书馆来说,这与此类似。对于那些希望为 Stripe 解决这个问题的人,这里是 :)
注意:该方案理论上会对延迟产生影响,但我们尚未在实践中体验到这一点。但是现在提到了:)
我已经恢复到 curl 7.69.1 并且一切正常。 现在,我已经从 yum 中删除了 curl + libcurl,所以它们不会更新。 感谢您的帮助和建议,如果我的风格不正确,我们深表歉意。
以防万一阅读本文的人正在使用 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 连接。这对我们来说立竿见影!
希望对您有所帮助:)
public_html/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php
请评论此 fn 中的这些行
public 静态函数 wrapSync( 可调用 $default, 可调用 $sync ) {
// return function (RequestInterface $request, array $options) use ($default, $sync) {
// return empty($options[RequestOptions::SYNCHRONOUS])
// ? $default($request, $options)
// : $sync($request, $options);
// };
}
我没有使用 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();
换句话说,下一个请求强制使用新的连接。在您的代码中查看重用连接的位置并尝试创建新连接。
我知道,这很糟糕,因为: - 是第三方的修补程序 - 不能重复使用相同的连接
但它奏效了。希望对你有帮助。