【问题标题】:Streaming a text file, auto update [closed]流式传输文本文件,自动更新[关闭]
【发布时间】:2014-02-07 00:59:00
【问题描述】:

我一直在到处寻找一种流式传输文本文件的方法。通过流式传输,我的意思是我希望页面记住它的位置,并且每次添加新条目时,它都会将其添加到底部。

示例 (从txt文件显示在页面上)

杰克

约翰

埃利斯

(文本文件更新为)

杰克

约翰

埃利斯

艾玛

卡莉

我希望该页面无需刷新整个页面即可获取更改。

我学习了很多。我已经想出了如何通过 php 在页面上显示文本文件(我的知识库仅限于自学的 php/html)。我可以让它刷新,但我每次都必须使用 javascript 自动将页面向下滚动到底部,并且每隔几秒钟刷新一次页面。

有什么想法或提示吗?

【问题讨论】:

  • 使用 AJAX 调用和 dom 摆弄,而不是成熟的服务器往返/重建

标签: php html


【解决方案1】:

好吧,我不会像史莱克的驴那样做:

我们到了吗?”,5 秒后,“我们到了吗?

这有什么问题?

带宽消耗,纯粹而简单。

我该怎么办?

答案是:服务器推送。或者像服务器推送这样的东西,因为无法使用 HTTP 从服务器启动。

如果有文件的新版本,与其每 5 秒轮询一次服务器,为什么不让服务器在它真的发生变化时通知你呢?

我该怎么做?

答案是:使用 Ajax,但使用不同的方法。

高级算法是:

  1. 从浏览器向服务器发送 Ajax 请求。
  2. 当服务器收到请求时,验证文件是否已更改。
    1. 如果发生变化,则返回新数据。
    2. 如果没有,让服务器休眠一段时间,然后返回步骤 2。
  3. 如果过了很长时间并且没有修改,服务器可以(或必须)返回一个响应,没有数据绑定到它。

如何检查文件是否已更改?

与其读取文件并比较数据,更好的方法是在请求中发送文件上次更改时间的时间戳。您可以使用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;

在客户端,每次收到响应时都必须重新运行请求。这可能(并且应该)有一点延迟。

我知道,这听起来像是一种开销,但只是让您知道还有其他方法可以做到这一点。

【讨论】:

  • 听起来不错,我试试看,谢谢
【解决方案2】:

我建议您使用 AJAX 定期调用 PHP 文件,该文件加载文本文件并更新您的 Web 内容以显示新内容。

类似这样:Refresh a table with jQuery/Ajax every 5 seconds

【讨论】:

  • 非常感谢,现在就看看这个
猜你喜欢
  • 2012-10-31
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多