【问题标题】:php output system() in real timephp实时输出system()
【发布时间】:2015-05-29 16:19:21
【问题描述】:

我正在尝试进行系统调用并将每一行实时发送到浏览器

echo('<pre>');
system('ping -c 10 www.google.com');
echo('</pre>);

当我从命令行调用它时,这有效(ping 的每一行一次输出一个)。但是,当我尝试使用浏览器(firefox 或 chrome)打开时,它不起作用。

我几乎可以肯定这与浏览器强制执行的输出缓冲有关。他们不会显示新数据,除非它高于 cetrain 阈值。这类问题的解决方案通常涉及输出一堆空白字符,即str_repeat(' ',1024*64)。你能想出什么办法让浏览器实时显示输出吗?

【问题讨论】:

  • 你必须刷新......请参阅:php.net/manual/fr/function.ob-flush.php 但我认为不适用于所有浏览器
  • @AbraCadaver 在文档中查看此示例 php.net/manual/en/… system 自动实时输出所有结果
  • @HalayemAnis 如何在system 调用的各个输出之间刷新?
  • @AbraCadaver,第一行写着Execute an external program and display the output。我使用了system 并确认它确实将整个输出发送到缓冲区。

标签: php firefox buffer


【解决方案1】:

你不能这样做。 您的 php 请求运行一次并重新运行一个响应。

系统函数的结果也会在你的命令执行结束时显示。您在命令行中看到的只是命令日志,而不是您的 php 代码。

我建议使用一种长轮询技术或 soquet-io 与您的服务器建立持续/实时通信。

【讨论】:

    【解决方案2】:
    <?php
    // WARNING : this define depends from web browser
    //           Google Chrome     => 1024
    //           Mozilla Firefox   => 2048 (not sure)
    //           Internet Explorer => Much more ... but works :)
    define ("NUMBER_BYTE_PADDERS", "1024" );
    
    ob_implicit_flush(1);
    print padder ("first message") . "<br />";
    
    sleep (5);
    print padder ("second message after 5 seconds") . "<br />";
    
    sleep (10);
    print padder ("third message after 15 seconds") . "<br />";
    
    
    function padder ($msg) {
        for ($i=0 ; $i < NUMBER_BYTE_PADDERS ; $i++) {
            $msg .= ' ';
        }
        return $msg;
    }
    

    ?>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多