Смысл: выполнить долгую artisan команду, и отслеживать ее выполнение (вывод консольного буфера) на фронте.
При загрузке страницы я аяксом запускаю команду (sync()) и далее по таймеру, пытаюсь получить getBuffer() и выводжу на экран. Разумеется, это не работает должным образом, так как сохранённый в кеш объект BufferedOutput, при десериализации уже будет новым объектом.
Как можно решить проблему?
public function sync(Request $request)
{
if ($request->ajax()) {
$sessionId = $request->get('sessionId');
/** @var BufferedOutput $buffer */
$buffer = Cache::remember("youtrack.buffer:$sessionId", 10, function () {
return new BufferedOutput;
});
set_time_limit(600);
Artisan::call('youtrack:sync', [], $buffer);
return ['success' => true, 'output' => nl2br(htmlspecialchars($buffer->fetch()))];
}
return view('youtrack.sync');
}
public function getBuffer(Request $request, $sessionId)
{
/** @var BufferedOutput $buffer */
$buffer = Cache::get("youtrack.buffer:$sessionId");
if (!$buffer instanceof BufferedOutput) {
abort(500, 'Buffer not found.');
}
return nl2br(htmlspecialchars($buffer->fetch()));
}