流式传输文本文件,自动更新

时间:2014-02-07 00:59:00

标签: php html

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

实施例 (显示在txt文件的页面上)

杰克

约翰

埃利斯

(文本文件更新为)

杰克

约翰

埃利斯

艾玛

卡莉

我希望页面能够在不刷新整个页面的情况下获取更改。

我学习了很多。我已经弄清楚如何通过php在页面上显示文本文件(我的知识库坚持使用php / html只能自学)。我可以让它刷新,但我必须使用javascript每次自动向下滚动页面到底部,并让页面每隔几秒刷新一次。

任何想法或提示?

2 个答案:

答案 0 :(得分:1)

好吧,我不会这样做史莱克的驴子方式:

"Are we there, yet?", 5 seconds later, "Are we there, yet?"

我们在那里,但是?“,5秒钟后,”我们在那里吗?

这有什么问题?

带宽消耗,纯粹而简单。

我该怎么办?

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

如果有新版本的文件,请不要每隔5秒轮询一次服务器,为什么不让服务器在真正发生变化时通知您?

我该怎么做?

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

高级算法是:

  1. 从浏览器向服务器发送Ajax请求。
  2. 当服务器收到请求时,请验证文件是否已更改。
    1. 如果已更改,则返回新数据。
    2. 如果没有,请让服务器暂停一段时间,然后再返回步骤2.
  3. 如果很长时间过去且没有修改,服务器可以(或必须)返回响应,没有数据限制。
  4. 如何检查文件是否已更改?

    不是读取文件并比较数据,更好的方法是使用请求发送文件最后更改时间的时间戳。您可以使用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内容以显示新内容。

它类似于:Refresh a table with jQuery/Ajax every 5 seconds