我需要读取永远不会完成的网址。
基本上,有一个尾随日志文件的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
答案 0 :(得分:3)
您可以检查长度并在达到预期长度后中止,或者您可以使用超时,或者更好的是,两者都可以。
既然你没有打扰一些代码:P,我会建议你需要什么来完成你想要的。其余的由你决定。
CURLOPT_TIMEOUT - 允许cURL函数执行的最大秒数。
CURLOPT_WRITEFUNCTION - 回调函数的名称,其中回调函数有两个参数。第一个是cURL资源,第二个是包含要写入数据的字符串。必须使用此回调函数写入数据。必须返回写入的确切字节数,否则将失败。
基本上,为CURLOPT_WRITEFUNCTION编写一个函数,并使其如果缓冲区长度大于预期值,则返回0.返回0有效地使CURL失败,从而关闭连接并继续执行脚本。
答案 1 :(得分:0)
你可以使用CURLOPT_LOW_SPEED_LIMIT和CURLOPT_LOW_SPEED_TIME,只有在特定时间内没有出现任何内容时才能使其纾困。
或者您可以使用多接口功能完全自行决定何时停止。