来自Symfony的PHP实时反馈

时间:2017-08-07 01:31:29

标签: php shell symfony sh

所以我希望能够从Symfony项目中的shell脚本获得实时反馈。通常我会做(像filename.php):

<html>
  <head>
  </head>
  <body>
    <?php echo getTheStuff(); ?>
  </body>
</html>

<?php

function getTheStuff() {
  while (@ ob_end_flush()); // end all output buffers if any

  $cmd = './test.sh';

  $proc = popen($cmd, 'r');
  echo '<pre>';
  while (!feof($proc))
  {
    echo fread($proc, 4096);
    @ flush();
  }
  echo '</pre>';

  return "OK";
}

此代码将查看脚本文件并继续通过可用数据发送。这意味着浏览器将在处理时显示test.sh的输出。

因为Symfony使用视图输出,所以在输出任何html之前,它会一直等到控制器完成处理。那么有什么方法可以在Symfony中做这种事情吗?

1 个答案:

答案 0 :(得分:1)

YMMV但是Symfony包含一个StreamedResponse可能会执行您需要的操作 - 您不一定需要返回HTML视图。确实有几种响应类型 - JsonResponseFileResponse等。

请注意

  

如果之前调用了ob_start()或者输出了send_buffering php.ini   选项已启用,您必须在flush()之前调用ob_flush()。

我已将此添加到下面的代码中,因为通常情况下,您可以删除ob_flush()行并让它仍然有用。

根据上面链接的文档:

use Symfony\Component\HttpFoundation\StreamedResponse;

// etc.

public function getTheStuffAction(): StreamedResponse 
{   
    $response = new StreamedResponse();
    $response->setCallback(function () {
        var_dump('Hello World');
        ob_flush();
        flush();
        sleep(2);
        var_dump('Hello World');
        ob_flush();
        flush();
    });

    return $response->send();
}

希望这会有所帮助:)