【问题标题】:How To watch a file write in PHP?如何查看用 PHP 写入的文件?
【发布时间】:2010-11-09 06:56:16
【问题描述】:

我想用PHP做tail命令之类的动作, 但是如何查看附加到文件?

【问题讨论】:

标签: php tail


【解决方案1】:

我不相信有什么神奇的方法可以做到这一点。您只需要不断地轮询文件大小并输出任何新数据。这实际上很容易,唯一需要注意的是文件大小和其他统计数据缓存在 php.ini 中。解决方法是在输出任何数据之前调用clearstatcache()。

这是一个快速示例,不包括任何错误处理:

function follow($file)
{
    $size = 0;
    while (true) {
        clearstatcache();
        $currentSize = filesize($file);
        if ($size == $currentSize) {
            usleep(100);
            continue;
        }

        $fh = fopen($file, "r");
        fseek($fh, $size);

        while ($d = fgets($fh)) {
            echo $d;
        }

        fclose($fh);
        $size = $currentSize;
    }
}

follow("file.txt");

【讨论】:

  • 您好,您的解决方案似乎消耗了大量 CPU(在我的测试配置中为 +-40%)。有没有更有效的查看文件夹的方法?
  • usleep(100) 正在休眠百万分之一秒,或 0.0001 秒。除非您需要极低的延迟,否则将其增加到 usleep(10000) (0.01s) 以降低 CPU 使用率。 usleep(2000000) 或 sleep(2) (2s) 表示您只是想在浏览时相当新鲜的东西。
  • 我试过这段代码,但没有成功……浏览器一直在加载……没有回显……
  • @ihtus 此代码不适用于浏览器,因为它不会结束(因此不会生成服务器响应或达到服务器超时)。
  • @ihtus:你可以flush浏览器
【解决方案2】:
$handle = popen("tail -f /var/log/your_file.log 2>&1", 'r');
while(!feof($handle)) {
    $buffer = fgets($handle);
    echo "$buffer\n";
    flush();
}
pclose($handle);

【讨论】:

  • 它使 apache 服务器崩溃.. 只对我这样做?
  • 检查您的错误日志以获取线索,但这不应该导致您的 apache 进程崩溃。
【解决方案3】:

结帐php-tail on Google code。这是一个使用 PHP 和 Javascript 的 2 文件实现,在我的测试中它的开销很小。

它甚至支持使用 grep 关键字进行过滤(对于每秒输出帧速率等的 ffmpeg 很有用)。

【讨论】:

    【解决方案4】:
    $handler = fopen('somefile.txt', 'r');
    
    // move you at the end of file
    fseek($handler, filesize( ));
    // move you at the begining of file
    fseek($handler, 0);
    

    您可能会考虑使用stream_get_line

    【讨论】:

      【解决方案5】:

      您可以定期检查文件修改时间,而不是轮询文件大小:filemtime

      【讨论】:

      • 两者都需要在表面下调用 stat(),所以这并不重要。
      【解决方案6】:

      以下是我从上面改编的。通过 ajax 调用定期调用它并附加到您的“持有人”(textarea)...希望这会有所帮助...感谢所有为 stackoverflow 和其他此类论坛做出贡献的人!

      /* Used by the programming module to output debug.txt */
      session_start();
      $_SESSION['tailSize'] = filesize("./debugLog.txt");
      if($_SESSION['tailPrevSize'] == '' || $_SESSION['tailPrevSize'] > $_SESSION['tailSize'])
      {
            $_SESSION['tailPrevSize'] = $_SESSION['tailSize'];
      }
      $tailDiff = $_SESSION['tailSize'] - $_SESSION['tailPrevSize'];
      $_SESSION['tailPrevSize'] = $_SESSION['tailSize'];
      
      /* Include your own security checks (valid user, etc) if required here */
      
      if(!$valid_user) {
         echo "Invalid system mode for this page.";
      }
      $handle = popen("tail -c ".$tailDiff." ./debugLog.txt 2>&1", 'r');
      while(!feof($handle)) {
          $buffer = fgets($handle);
          echo "$buffer";
          flush(); 
      }
      pclose($handle);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 1970-01-01
        • 2016-01-16
        • 2013-06-06
        • 2010-12-18
        相关资源
        最近更新 更多