设置全局CURL超时时间

13

我正在使用一个专有的第三方Drupal模块,通过curl查询第三方服务。这个服务最近有点不稳定,导致我的页面加载速度变慢,并且在有大量访问时会达到最大连接数。

这个扩展查询的信息并不是至关重要的,但它足够重要,以至于我不能只是删除这个模块。目前,我通过修补该模块以添加curl超时请求来解决了这个问题:

curl_setopt($ch, CURLOPT_TIMEOUT, 1);

然而,我不想保留黑客手段,因为它会在下一次更新时消失,而且由于问题是间歇性的,它不会出现在测试中。

是否有任何方法可以在php.ini设置或通过代码在PHP中全局设置超时时间(我可以在自定义模块中使用)?

非常感谢任何帮助。

谢谢


也许是 default_socket_timeout,默认值为60秒。 - PKeidel
@PKeidel,这对我解决了问题。请写一个答案,这样我就可以接受它。 :) - Matt
2个回答

17

PHP的CURL使用php.ini中的设置default_socket_timeout。默认值是60,单位为秒。


据我所知,这是不正确的:“cURL默认具有无限超时时间,并且不遵守default_socket_timeout INI设置。这意味着您必须在代码中的每个cURL调用中配置超时时间。” https://tideways.com/profiler/blog/using-http-client-timeouts-in-php - drAlberT
1
Curl不遵守该值。 - drAlberT
1
我在我的php.ini文件中更新了这个,cUrl超时时间也改变了。忽略@drAlberT的评论。 - JDandChips
也许你是对的,但是在哪个php版本上呢?您确定您的测试在8.x和7.x上是有效的吗? - drAlberT
@drAlberT 我在 PHP 8 上尝试了这个答案,它有效。curl 更改了其超时时间。 - Akmal
显示剩余3条评论

2
作者和维护者在这里声明:

当使用libcurl时,如果没有设置CURLOPT_CONNECTTIMEOUT,超时的默认值是多少秒?

根本没有。

更完整的答案可以在另一个Stackoverflow问题中找到:

libcurl列出了以下与连接超时相关的设置:
  • CURLOPT_FTP_RESPONSE_TIMEOUT:没有默认值(无限期)
  • CURLOPT_TIMEOUT:没有默认值(无限期)
  • CURLOPT_TIMEOUT_MS:没有默认值(无限期)
  • CURLOPT_CONNECTTIMEOUT:默认为300秒
  • CURLOPT_CONNECTTIMEOUT_MS:没有默认值
  • CURLOPT_ACCEPTTIMEOUT_MS:默认为60000毫秒
PHP源代码没有覆盖上述任何默认设置:https://github.com/php/php-src/blob/master/ext/curl/interface.c。PHP绑定唯一与之有关的参数是CURLOPT_DNS_CACHE_TIMEOUT,将默认值从60秒更改为120秒:https://github.com/php/php-src/blob/a0e3ca1c986681d0136ce4550359ecee2826a80c/ext/curl/interface.c#L1926
所以:不,php-curl不遵守default_socket_timeout设置。我们甚至在调查一些客户问题时发现了几个服务器卡在了一天前(甚至是数月前)的curl请求上。
而且似乎没有办法全局设置超时时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接