PHP cURL与部分传输

时间:2011-03-18 20:56:46

标签: php curl

我需要读取永远不会完成的网址。

基本上,有一个尾随日志文件的Web服务。也就是说,它返回文件的最后10行左右,并且当写入新行时,它会立即发送它们。此HTTP请求将永远继续。如果您使用浏览器点击它,您将看到前10行,并且浏览器的进度指示器将继续显示进度,即使没有显示任何内容(直到更多行添加到日志文件中)。

我有一个PHP脚本需要对这些日志行做些什么。我想要做的是用cURL点击这个URL,下载可用的内容,如果日志文件是静默的(也就是说,不再添加行数)10秒左右,请结束请求。我不能简单地在这里做一个超时,因为如果有一个繁忙的日志文件,它可能会持续下载一段时间。但对于大多数日志,写入它们只是定期的。

有关如何实现这一目标的任何想法?我没有看到任何有用的cURL选项,可能会导致直接打开套接字。


解决方案

感谢@Christian Sciberras,我能够实现这一目标。以下是其他需要类似内容的基本示例代码:

<?php
$ch=curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://www.whatever.com');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'read_body');
curl_exec($ch);

if ($error=curl_error($ch)) {
    echo "Error: ", $error;
}

function read_body($ch, $string) {
    //Any new line that comes in appears on $string.  Handle it here.
    $length=strlen($string);
    echo $length, " bytes  |  ", $string;
    return $length; //Return the number of bytes that were handled.  Anything other than the length that was sent, and cURL will error out.
}
?>

此外,还有更多信息:http://curl.haxx.se/libcurl/php/examples/callbacks.html

2 个答案:

答案 0 :(得分:3)

您可以检查长度并在达到预期长度后中止,或者您可以使用超时,或者更好的是,两者都可以。

既然你没有打扰一些代码:P,我会建议你需要什么来完成你想要的。其余的由你决定。

  
    

CURLOPT_TIMEOUT - 允许cURL函数执行的最大秒数。

         

CURLOPT_WRITEFUNCTION - 回调函数的名称,其中回调函数有两个参数。第一个是cURL资源,第二个是包含要写入数据的字符串。必须使用此回调函数写入数据。必须返回写入的确切字节数,否则将失败。

  

基本上,为CURLOPT_WRITEFUNCTION编写一个函数,并使其如果缓冲区长度大于预期值,则返回0.返回0有效地使CURL失败,从而关闭连接并继续执行脚本。

答案 1 :(得分:0)

可以使用CURLOPT_LOW_SPEED_LIMIT和CURLOPT_LOW_SPEED_TIME,只有在特定时间内没有出现任何内容时才能使其纾困。

或者您可以使用多接口功能完全自行决定何时停止。