【问题标题】:Printing to terminal while using output buffering in CLI PHP scripts在 CLI PHP 脚本中使用输出缓冲时打印到终端
【发布时间】:2010-11-24 06:51:01
【问题描述】:

我正在使用命令行 PHP 离线构建一些文件。为了捕获脚本输出,我使用标准的 ob_start 东西:

ob_start();
// Echo lots of stuff
$content = ob_get_contents();
// Now the $content can be written to a file

但是,我还想在将“主要输出”收集到缓冲区中的同时向终端打印一些消息(例如,警告)。有没有办法做到这一点?似乎不可能暂停缓冲一段时间以打印终端消息,然后从它离开的地方继续缓冲。有什么解决方法吗?

【问题讨论】:

    标签: php command-line


    【解决方案1】:

    只需使用 fputs() 写入 STDOUT 或 STDERR(两个常量都包含文件指针资源):

    ob_start();
    echo 'Output buffer';
    fputs(STDOUT, "Log message");
    $x = ob_get_contents();
    ob_end_clean();;
    
    echo "X = $x";
    

    【讨论】:

      【解决方案2】:

      使用php://stderr 流:

      $f = fopen('php://stderr', 'w');
      fputs($f, 'Output');
      

      编辑:另外,在 CLI 中,有一个 predefined STDERR constant

      fputs(STDERR, 'Output');
      

      【讨论】:

        【解决方案3】:

        可以“暂停”输出缓冲区。将缓冲区的内容写入变量,并在不刷新的情况下结束缓冲区。写一些非缓冲输出,然后再次调用 ob_start()。该方法使用字符串连接,是一种比较脏的方法。出于这个原因,我更喜欢其他方法而不是我自己的方法。

        但无论哪种情况,这里都有一个小例子:

        <?php
        ob_start();
            echo 'Buffered line 1.<br>';
        $ob = ob_get_contents();
        ob_end_clean();
        
        echo 'Non-buffered line.<br>';
        
        ob_start();
            echo 'Buffered line 2.<br>';
        $ob .= ob_get_contents();
        ob_end_clean();
        
        echo 'Non-buffered line.<br>';
        
        ob_start();
            echo 'Buffered line 3.<br>';
        $ob .= ob_get_contents();
        ob_end_clean();
        
        echo 'Non-buffered line.<br>';
        
        echo $ob;
        ?>
        

        【讨论】:

          猜你喜欢
          • 2019-07-07
          • 2020-02-24
          • 2014-01-04
          • 1970-01-01
          • 1970-01-01
          • 2012-01-10
          • 2022-01-20
          • 1970-01-01
          • 2012-08-01
          相关资源
          最近更新 更多