我需要读取一直在变化的文件。只有文件,并且只会有一行一直在变化。
我发现以下代码应该按照我的要求执行:PHP: How to read a file live that is constantly being written to
但代码不起作用,页面只是不断加载,我试图像一个用户建议的那样添加“flush”,但我仍然无法使其工作。
这是代码
$file='/home/user/youfile.txt';
$lastpos = 0;
while (true) {
usleep(300000); //0.3 s
clearstatcache(false, $file);
$len = filesize($file);
if ($len < $lastpos) {
//file deleted or reset
$lastpos = $len;
}
elseif ($len > $lastpos) {
$f = fopen($file, "rb");
if ($f === false)
die();
fseek($f, $lastpos);
while (!feof($f)) {
$buffer = fread($f, 4096);
echo $buffer;
flush();
}
$lastpos = ftell($f);
fclose($f);
}
}
请有人看看,让我知道如何解决它。 提前谢谢。
答案 0 :(得分:2)
如果您的文件只有一个字符串,并且您需要在更改时阅读它,请使用以下代码:
$file = '/path/to/test.txt';
$last_modify_time = 0;
while (true) {
sleep(1); // 1 s
clearstatcache(true, $file);
$curr_modify_time = filemtime($file);
if ($last_modify_time < $curr_modify_time) {
echo file_get_contents($file);
}
$last_modify_time = $curr_modify_time;
}
注意:强>
filemtime()
以秒为单位返回上次文件修改时间,因此如果您需要每秒检查多次修改,可能需要找到其他解决方案。
此外,您可能需要添加set_time_limit(0);
,具体取决于您的要求。
<强>更新强>
的index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"
type="text/javascript">
</script>
</head>
<body>
<div id="file_content"></div>
<script>
var time = 0;
setInterval(function() {
$.ajax({
type: "POST",
data: {time : time},
url: "fileupdate.php",
success: function (data) {
var result = $.parseJSON(data)
if (result.content) {
$('#file_content').append('<br>' + result.content);
}
time = result.time;
}
});
}, 1000);
</script>
</body>
fileupdate.php
<?php
$file = 'test.txt';
$result = array();
clearstatcache(true, $file);
$data['time'] = filemtime($file);
$data['content'] = $_POST['time'] < $data['time']
? file_get_contents($file)
: false;
echo json_encode($data);
答案 1 :(得分:0)
你可能会遇到3个缺点:
$lastpos
。这意味着,它总是会在文件末尾查找添加的内容。你不清楚OP,但我认为这不是你想要的。我认为你唯一的一条线不断变化,但不一定要改变尺寸。因此,您可能希望删除该行$lastpos = ftell($f);
。