我一直在寻找一种流式传输文本文件的方法。通过流媒体,我的意思是我希望页面记住它的位置,每次添加新条目时,它都会将其添加到底部。
实施例 (显示在txt文件的页面上)
杰克
约翰
埃利斯
(文本文件更新为)
杰克
约翰
埃利斯
艾玛
卡莉
我希望页面能够在不刷新整个页面的情况下获取更改。
我学习了很多。我已经弄清楚如何通过php在页面上显示文本文件(我的知识库坚持使用php / html只能自学)。我可以让它刷新,但我必须使用javascript每次自动向下滚动页面到底部,并让页面每隔几秒刷新一次。
任何想法或提示?
答案 0 :(得分:1)
好吧,我不会这样做史莱克的驴子方式:
我们在那里,但是?“,5秒钟后,”我们在那里吗?
带宽消耗,纯粹而简单。
答案是:服务器推送。或者像Server Push这样的东西,因为无法通过HTTP从服务器启动。
如果有新版本的文件,请不要每隔5秒轮询一次服务器,为什么不让服务器在真正发生变化时通知您?
答案是:使用Ajax,但采用不同的方法。
高级算法是:
不是读取文件并比较数据,更好的方法是使用请求发送文件最后更改时间的时间戳。您可以使用filemtime
功能执行此操作。
在服务器上,验证文件的上次修改时间是否大于来自请求的文件。如果是,则读取文件并发送响应以及新文件修改时间(步骤2a)。如果没有,请转到步骤2b并使用usleep
功能使服务器休眠一段时间并节省CPU。
要知道是否已经过了很长时间并且没有任何变化,您可以在脚本开头使用microtime
函数,并在每次迭代时使其值不同。如果已经过了很长时间,你会发送一个空的回复。
制作草稿,服务器端脚本就像:
$startTime = microtime();
$filePath = '/path/to/file.txt';
$lastModifiedTime = $_GET['lastModifiedTyme']; // Supposing it comes from the query string
$currentModifiedTime = null;
while ($currentModifiedTime = filemtime($filePath) < $lastModifiedTime) {
usleep(1000); // dorme por 1 seg.
// If has passed more than 1 minute
if ((microtime() - $startTime) > 60000) {
header('HTTP/1.1 304 Not Modified'); // Or simply http_response_code(304) for PHP 5.4+
exit;
}
}
$data = file_get_contents($file);
$jsonResponse = json_encode(array(
'data' => $data,
'modifiedTime' => $currentModifiedTime
);
echo $jsonResponse;
在客户端,每次收到回复时都必须重新运行请求。这可能(而且应该)有一个小小的延迟。
这听起来像是一种开销,我知道,但只是为了让你知道还有另外一种方法可以做到这一点。
答案 1 :(得分:0)
我建议您使用AJAX定期调用PHP文件,该文件加载文本文件并更新您的Web内容以显示新内容。