我正在尝试使用 CURL 请求从 API 检索一些数据。是否可以跟踪从请求开始经过的时间并在一段时间后停止请求,可能小于设置的超时时间?
笔记:
我的目标是不设置超时。让请求继续,直到不出现另一个作业/功能调用。可能吗?
详细地:
我真正想要的是,我有一个通过 Ajax 调用然后 CURL 启动的函数,另一个 Ajax 也将使用一些特定参数调用该函数,当第二个 ajax 调用发生时,CURL 的执行应该停止。但是这两个调用中的时间间隔是任意的。
您可以通过cURL 传输 ( php doc )的设置CURLOPT_CONNECTTIMEOUT
和选项来定义它CURLOPT_TIMEOUT
Use can use CURLOPT_CONNECTTIMEOUT and CURLOPT_TIMEOUT for setting cURL options via curl_setopt() function as follows:
<?php
// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, false);
// The number of seconds to wait while trying to connect.
// Use 0 to wait indefinitely.
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
// The maximum number of seconds to allow cURL functions to execute
curl_setopt($ch, CURLOPT_TIMEOUT, 10)
// grab URL and pass it to the browser
curl_exec($ch);
// close cURL resource, and free up system resources
curl_close($ch);
我真正想要的是,我有一个通过 Ajax 调用然后 CURL 启动的函数,另一个 Ajax 也将使用一些特定参数调用该函数,当第二个 ajax 调用发生时,CURL 的执行应该停止
然后你需要在你的 JavaScript 代码中这样做。只需.abort()
发送新的 AJAX 请求之前的前一个 AJAX 请求。
我不确定您使用什么来确定何时足够,但以下内容将停止其轨道中的 curl 下载:
curl_setopt($ch, CURLOPT_WRITEFUNCTION, array($ch, "downloader"));
downloader
只是一个随机函数名,它需要 curl 资源和函数名来传递接收到的输入以进行保存。它必须返回接收到的长度,或者连接中止,所以如果你不希望这种情况发生,你会得到以下内容:
function downloader($curlHandle,$data)
{
$data_string .= $data; // Store your data for later.
$data_length = strlen($data); // Get length of current chunk
return $data_length; // pass it back and keep going.
}
现在,假设您有一个指示“停止卷曲!”的全局变量。您可以返回错误的大小并中止传输。就像是:
function downloader($curlHandle,$data)
{
$data_string .= $data; // Store your data for later.
$data_length = strlen($data); // Get length of current chunk
global $stop_curl;
return ($stop_curl) ? "" : $data_length;
}
像这样在 PHP 中获取脚本执行时间的简单方法:
function microtime_float()
{
list($utime, $time) = explode(" ", microtime());
return ((float)$utime + (float)$time);
}
$script_start = microtime_float();
// here your curl request start
....
// here your curl request stop
$script_end = microtime_float();
echo "Script executed in ".bcsub($script_end, $script_start, 4)." seconds.";