在PHP中设置Curl超时

我通过PHP在eXist数据库上运行curl请求。 数据集非常大,因此数据库一直需要很长时间才能返回XML响应。 为了解决这个问题,我们设置了一个curl请求,应该是一个很长的超时。

$ch = curl_init(); $headers["Content-Length"] = strlen($postString); $headers["User-Agent"] = "Curl/1.0"; curl_setopt($ch, CURLOPT_URL, $requestUrl); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERPWD, 'admin:'); curl_setopt($ch,CURLOPT_TIMEOUT,1000); $response = curl_exec($ch); curl_close($ch); 

但是,curl请求在请求完成之前一直结束(当通过浏览器请求时<1000)。 有没有人知道这是否是在curl中设置超时的正确方法?

请参阅文档: http : //www.php.net/manual/en/function.curl-setopt.php

CURLOPT_CONNECTTIMEOUT – 尝试连接时等待的秒数。 使用0等待无限期。
CURLOPT_TIMEOUT – 允许执行cURL函数的最大秒数。

 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0); curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds 

也不要忘记放大php脚本的执行时间:

 set_time_limit(0);// to infinity for example 

嗯,它看起来像我CURLOPT_TIMEOUT定义的时间量,允许任何cURL函数执行。 我想你实际上应该看看CURLOPT_CONNECTTIMEOUT ,因为这会告诉cURL等待连接完成的最长时间。

您的代码将超时设置为1000 。 对于毫秒,使用CURLOPT_TIMEOUT_MS

有一个怪癖,这可能是相关的一些人…从PHP文档评论。

如果你希望cURL在不到一秒的时间内超时,你可以使用CURLOPT_TIMEOUT_MS ,虽然在“类Unix系统”上有一个bug /“function”,导致libcurl立即超时,如果该值<1000毫秒,curl错误(28):达到超时“。 这种行为的解释是:

“如果使用标准的系统名称parsing器来构buildlibcurl,那么传输的这一部分仍然会使用全秒的超时解决scheme,并且允许的最小超时时间为1秒。

这对于PHP开发人员意味着什么:“如果不先testing它,就不能使用这个函数,因为你不知道libcurl是否使用了标准的系统名parsing器(但是你可以肯定的是)”

问题是,在(Li | U)nix上,当libcurl使用标准名称parsing器时,在名称parsing期间引发了一个SIGALRM,而libcurl认为这是超时警报。

解决方法是使用CURLOPT_NOSIGNAL禁用信号。 下面是一个示例脚本,它会请求自己造成10秒的延迟,以便testing超时:

 <?php if (!isset($_GET['foo'])) { // Client $ch = curl_init('http://localhost/test/test_timeout.php?foo=bar'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_NOSIGNAL, 1); curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); $data = curl_exec($ch); $curl_errno = curl_errno($ch); $curl_error = curl_error($ch); curl_close($ch); if ($curl_errno > 0) { echo "cURL Error ($curl_errno): $curl_error\n"; } else { echo "Data received: $data\n"; } } else { // Server sleep(10); echo "Done."; } ?> 

http://www.php.net/manual/en/function.curl-setopt.php#104597

您不能从浏览器运行请求,它会超时等待运行CURL请求的服务器作出响应。 浏览器可能在1-2分钟内超时,默认networking超时。

你需要从命令行/terminal运行它。

您需要确定您和文件之间的超时时间。 在这种情况下PHP和Curl。

为了让Curl在传输仍然有效时永不超时,需要将CURLOPT_TIMEOUT0而不是1000

 curl_setopt($ch, CURLOPT_TIMEOUT, 0); 

在PHP中,您必须再次删除时间限制或PHP自身(默认30秒后)会按照Curl的请求来终止脚本。 只有这一点应该解决你的问题
另外,如果您需要数据完整性,则可以使用ignore_user_abort添加一层安全性:

 # The maximum execution time, in seconds. If set to zero, no time limit is imposed. set_time_limit(0); # Make sure to keep alive the script when a client disconnect. ignore_user_abort(true); 

客户端断开将中断脚本的执行并可能破坏数据,
例如。 非过渡性的数据库查询,build立一个configuration文件,ecc。,而在你的情况下,它会下载一个部分文件…你可能会或不会关心这个。

回答这个老问题,因为这个线程在引擎searchCURL_TIMEOUT的顶部。

如果您使用PHP作为fastCGI应用程序,请确保您检查fastCGI超时设置。 请参阅: PHPcurl放500错误