Задать вопрос
@l4m3r

Каким образом можно сохранить instance объекта между запросами?

Смысл: выполнить долгую 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()));
}
  • Вопрос задан
  • 211 просмотров
Подписаться 2 Простой 1 комментарий
Решения вопроса 2
Никак. Можешь во время выполнения записывают текущий процесс в "файл". И уже из файла взять готовые данные.

Я так понимаю в данном месте Artisan::call('youtrack:sync', [], $buffer);
вы вызываете свое какое то консольное приложение. А "youtrack:sync" это какая то команда. Вот там внутри и нужно процесс записывать в файл.
Ответ написан
Комментировать
profesor08
@profesor08
Записывай весь вывод команды в файл, на фронт выводи содержимое файла. В результате получишь весь нужный вывод.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
hOtRush
@hOtRush
Для такой задачи отлично подойдет старый добрый Gearman.

При выполнении задачи в очереди можно писать статус выполнения в процентном/количественном соотношении, к примеру sendStatus(10, 100) - выполнено 10%. И из любого места приложения получить этот статус по job id.

php.net/manual/en/gearmanclient.jobstatus.php
php.net/manual/en/gearmanjob.sendstatus.php

Ну и вообще иметь вот это в контроллере - очень плохая практика) Для этого есть очереди как бы
set_time_limit(600);
Artisan::call('youtrack:sync', [], $buffer);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы