【问题标题】:Live feedback from PHP in SymfonySymfony 中 PHP 的实时反馈
【发布时间】:2018-01-14 05:58:49
【问题描述】:

所以我希望能够从 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 中做这种事情吗?

【问题讨论】:

标签: php shell symfony sh


【解决方案1】:

YMMV 但 Symfony 包含一个 StreamedResponse 可能会满足您的需求 - 您不一定需要返回 HTML 视图。实际上有几种响应类型 - JsonResponseFileResponse 等。

注意

如果 ob_start() 之前已经调用过或者 output_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();
}

希望这会有所帮助:)

【讨论】:

  • 效果很好,只是为 ob_flush() 添加了一个编辑;我这样做时必须使用它,因为我相信默认供应商库之一使用 ob_start(),所以默认情况下这是必需的(我检查并在 php.ini 中使用 output_buffering)。
  • 太好了,很高兴听到它:)
  • 不知道为什么编辑被@pete 和 Nigel Ren 拒绝,因为它需要工作!如果调用了 ob_start()(通常在 Symfony 中)或启用了 output_buffering php.ini 选项,则需要在每次 flush() 之前添加 ob_flush()。
  • 我批准了您的编辑 - 毕竟这是您的问题。
  • 谢谢,这将帮助任何希望在未来做同样事情的人。
猜你喜欢
  • 1970-01-01
  • 2019-10-17
  • 2012-04-05
  • 2014-03-04
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多