Art*_*cto 23
你需要循环睡眠:
$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);
}
}
Run Code Online (Sandbox Code Playgroud)
(测试..它的工作原理)
是的,您需要在循环中休眠一段时间,但不必重新打开文件。我只是在寻找类似的问题。我想读取自上次读取以来可能已更改的文件。
问题是资源已到达文件末尾 ( EOF)。并且不再继续阅读。解决办法是用 重置指针fseek($fh, ftell($fh))。
等待文本文件中输入的完整程序可能如下所示:
<?php
$fh = fopen('/var/log/system', 'r');
while (true) {
$line = fgets($fh);
if ($line !== false) {
// show the line or send it via email or to a websocket..
} else {
// sleep for 0.1 seconds (or more?)
usleep(0.1 * 1000000);
fseek($fh, ftell($fh));
}
}
Run Code Online (Sandbox Code Playgroud)