1

我正在尝试使用 CURL 请求从 API 检索一些数据。是否可以跟踪从请求开始经过的时间并在一段时间后停止请求,可能小于设置的超时时间?

笔记:

我的目标是不设置超时。让请求继续,直到不出现另一个作业/功能调用。可能吗?

详细地:

我真正想要的是,我有一个通过 Ajax 调用然后 CURL 启动的函数,另一个 Ajax 也将使用一些特定参数调用该函数,当第二个 ajax 调用发生时,CURL 的执行应该停止。但是这两个调用中的时间间隔是任意的。

4

5 回答 5

3

您可以通过cURL 传输 ( php doc )的设置CURLOPT_CONNECTTIMEOUT和选项来定义它CURLOPT_TIMEOUT

于 2012-05-04T06:58:20.363 回答
1

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);
于 2012-05-04T07:03:35.130 回答
1

我真正想要的是,我有一个通过 Ajax 调用然后 CURL 启动的函数,另一个 Ajax 也将使用一些特定参数调用该函数,当第二个 ajax 调用发生时,CURL 的执行应该停止

然后你需要在你的 JavaScript 代码中这样做。只需.abort()发送新的 AJAX 请求之前的前一个 AJAX 请求。

于 2012-05-04T07:23:07.043 回答
1

我不确定您使用什么来确定何时足够,但以下内容将停止其轨道中的 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;
          }
于 2012-05-04T07:23:09.747 回答
-2

像这样在 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.";
于 2012-05-04T07:01:50.857 回答