Продолжить выполнение долго выполняющегося кода после вывода страницы в CakePHP - PullRequest
1 голос
/ 15 февраля 2012

У меня есть консоль управления внутренними данными, написанная на CakePHP, которая позволяет пользователю управлять некоторыми иерархическими данными.Каждый раз, когда пользователь вносит изменения в данные, я хочу восстановить файл данных (в данном случае JSON), который используется в веб-интерфейсе сайта.

Перестройка может занять некоторое время, и мне нужен внутренний интерфейсбыть немного более отзывчивым.Моя идея состоит в том, чтобы перестроить JSON после того, как новая страница (страница «ваши изменения были сохранены») будет предоставлена ​​пользователю.У меня есть некоторый код внутри afterFilter() обратного вызова в моем app_controller.php, но страница фактически не отображается в браузере, пока не завершится перестройка JSON.

Я нашел примеры кода для простого- PHP, который выполняет такие вещи, как отправка HTTP-заголовка Connection: Close и / или использует очистку буфера вывода, чтобы сообщить браузеру, что сервер завершил работу во время обработки, но эти методы не (насколько я могу судить) работают с CakePHPструктура и собственная выходная буферизация.

Мне нужна техника, которая позволила бы мне полностью отобразить представление для пользователя, а затем, как только пользователь загрузит свою страницу, продолжить выполнение перестроения JSON вСправочная информация.

Я понимаю, что могут быть проблемы, связанные с ситуацией / настройкой, которые могут повлиять на ситуацию, поэтому, пожалуйста, дайте мне знать, если у вас есть вопросы по поводу моего конкретного приложения.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

эти плагины очереди CakePHP придуманы именно для этой цели: https://github.com/MSeven/cakephp_queue

они отделяют интерфейс от сервисов бэкэнда, как те генерации файлов.

2 голосов
/ 15 февраля 2012

Вот предложение. Вот как я запускал долго выполняющиеся процессы из пользовательского интерфейса для очистки файлов. Сначала создайте ОБОЛОЧКУ для выполнения обработки. http://book.cakephp.org/2.0/en/console-and-shells.html#Shell

Это предоставит код, который будет запускать фоновый процесс, который вы хотите запустить.

Затем настройте метод на стороне пользовательского интерфейса для вызова оболочки. Возьмите PID и сохраните его в базе данных (чтобы можно было узнать, когда он закончится).

$PID = shell_exec("/path/to/cake/console/cake SHELLNAME SHELLMETHOD");
$this->Jobs->query("UPDATE `jobs` SET `pid` = $pid WHERE `id` = $job_id");

Тогда вы всегда можете проверить, запущен ли процесс, проверив /proc/$PID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...