我想运行一个需要花费3-5分钟才能在Laravel中执行的python脚本。在其运行时,我想在它们之间复制打印消息并将其显示在刀片模板上。
我设法做到了
<div>
<h1>Application Status</h1>
{{ print_r(auth()->user()->liveExecuteCommand("cd ../../python-script && python3 -u main.py")) }}
</div>
这里有我从另一个答案here中获得的liveExecuteCommand函数
public function liveExecuteCommand($cmd)
{
while (@ob_end_flush()); // end all output buffers if any
$proc = popen("$cmd 2>&1 ; echo Exit status : $?", 'r');
$live_output = "";
$complete_output = "";
echo '<code><pre>';
while (!feof($proc)) {
$live_output = fread($proc, 4096);
$complete_output = $complete_output . $live_output;
echo "$live_output";
@flush();
}
echo '</pre></code>';
pclose($proc);
// get exit status
preg_match('/[0-9]+$/', $complete_output, $matches);
// return exit status and intended output
return array(
'exit_status' => intval($matches[0]),
'output' => str_replace("Exit status : " . $matches[0], '', $complete_output),
);
}
我的问题是:该脚本在呈现HTML和CSS之前开始运行,并且我得到了一个非常基本的html页面,而不是我的通常页面。一旦脚本运行完毕,其余的CSS就会加载,页面看起来也很好。但是,等待3-5分钟使页面正常运行似乎不是一个好主意。
我也尝试使用Symfony's Process,但是我无法使实时执行工作在python中。我什至尝试了-u unbuffer标志,但是没有用。它会运行整个脚本,然后加载页面
有什么更好的方法吗?在Blade中调用函数对我来说似乎不可行。我还尝试了在Controller中调用该函数,但随后我不得不等待程序执行才能将输出传递给视图。