如何在Laravel Blade中显示python脚本的实时输出

时间:2018-12-24 11:06:26

标签: php python laravel laravel-blade

我想运行一个需要花费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中调用该函数,但随后我不得不等待程序执行才能将输出传递给视图。

0 个答案:

没有答案