所以我希望能够从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中做这种事情吗?
答案 0 :(得分:1)
YMMV但是Symfony包含一个StreamedResponse
可能会执行您需要的操作 - 您不一定需要返回HTML视图。确实有几种响应类型 - JsonResponse
,FileResponse
等。
请注意
如果之前调用了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();
}
希望这会有所帮助:)