使用 PHP 跟踪文本文件中的更改

Posted

技术标签:

【中文标题】使用 PHP 跟踪文本文件中的更改【英文标题】:Tracking changes in text file with PHP 【发布时间】:2012-06-19 18:21:11 【问题描述】:

我有一个 php 脚本,当服务器上发生特定事情时,它必须在客户端(服务器推送)上重新加载页面。所以我必须倾听变化。我的想法是有一个文本文件,其中包含当前页面的页面加载次数。所以我想监控文件,一旦它被修改,就使用服务器推送来更新客户端上的内容。问题是如何在 PHP 中跟踪文件的变化?

【问题讨论】:

PHP 没有这样的机制,只是不断地轮询文件以查看时间戳/大小是否已更改。然而,大多数现代操作系统都有通知系统,您可能会使用它,这将为您完成繁重的工作。但既然你没有说你在哪个操作系统上...... en.wikipedia.org/wiki/Comet%5F%28programming%29 这可能会有所帮助 但是页面的重新加载不会导致计数器也发生变化吗?所以你最终会得到一个不断刷新的页面。 【参考方案1】:

你可以这样做:

<?php
while(true)
    $file = stat('/file');
    if($file['mtime'] == time())
        //... Do Something Here ..//
    
    sleep(1);

这将每秒不断地寻找文件修改时间的变化。如果你不限制它,你可能会杀死你的磁盘 IO,并且可能需要调整你的 ulimit。

【讨论】:

确保你包含一些最终打破这个循环的东西!这会让机器立即崩溃。【参考方案2】:

这将检查您的文件是否有更改:

<?php
  $current_contents = "";  

  function checkForChange($filepath) 
    global $current_contents;

    $new_contents = file_get_contents($filepath);
    if (strcmp($new_contents, $current_contents) 
      $current_contents = $new_contents;
      return true;
    

    return false;
  

但这并不能解决您的问题。为客户端提供服务的 php 文件在呈现的 html 发送到客户端之前完成执行。该客户端将需要回调某个 php 文件以检查更改...由于这也是一个 http 请求,因此该文件将完成执行并忘记内存中的任何内容。

为了正确解决这个问题,您可能不得不放弃检查文件的想法。服务器需要知道何时以及如何联系当前连接的客户端,或者这些客户端需要定期轮询轻量级服务。

【讨论】:

【参考方案3】:

这有点 hacky,但是创建一个 cron 作业来吸收页面,将其存储在范围或表中,然后简单地每 30 秒比较一次呢?

【讨论】:

以上是关于使用 PHP 跟踪文本文件中的更改的主要内容,如果未能解决你的问题,请参考以下文章

使用没有无限循环的 C++ i 检测文本文件中的更改?

我如何使用Combine来跟踪UIViewRepresentable类中的UITextField更改?

使用scanner类更改文本文件中的特定文本(java)

使用用户输入更改文本文件中的特定单词

纯 javascript 文本滑块,可更改 php 中的文本显示

.gitignore 不会停止在文件中跟踪更改