因此,我希望能够从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做这样的事吗?
发布于 2017-08-06 17:42:29
但是Symfony包含一个StreamedResponse
,它可以满足您的需要--您不一定需要返回一个HTML视图。实际上,有几种响应类型-- JsonResponse
、FileResponse
等。
请注意,
如果之前已经调用了ob_start(),或者启用了output_buffering php.ini选项,则必须在ob_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();
}
希望这会有所帮助:)
https://stackoverflow.com/questions/45538259
复制相似问题