Как написать асинхронный веб-сервис, запущенный в фоновом режиме php - PullRequest
4 голосов
/ 02 сентября 2011

Я собираюсь написать веб-сервис фоновой обработки с использованием php, который должен работать в фоновом режиме, даже если пользователь закрыл браузер. Есть ли способ сделать это с помощью php?

Подробнее

Да, я работаю над большим веб-проектом (pay roll), используя symfony / php. он должен обрабатываться каждый месяц, когда приходит пользователь с зарплатой и нажимает кнопку процесса. тогда платежная ведомость должна обрабатываться без тайм-аута сервера Apache. для этого я надеюсь создать асинхронный веб-сервис, работающий в фоновом режиме.

Ответы [ 2 ]

6 голосов
/ 02 сентября 2011

Как сказал комментатор, вы должны использовать CRON job , так как оно лучше всего подходит для такого рода проблем. Однако вам нужно запустить свою работу по клику пользователя. Вот что я бы использовал:

  1. По щелчку пользователя создайте строку в некоторой таблице или создайте файл с необходимым параметром для выполнения задачи. В основном это говорит CRON «эй, тебе нужно запустить задачу».
  2. Настроить задание CRON для просмотра этой строки / файла каждую минуту, и запустить задачу, если строка / файл найден. Удалить файл перед запуск задачи, или параллельные задачи могут произойти.
  3. Если вам нужно сообщить своему пользователю, когда заработная плата будет завершена, сделайте Задача создать еще одну строку / файл, чтобы показать, что CRON закончился, и с javascript обновляет страницу пользователя каждые 30 секунд / 1 мин и останавливает автоматическое обновление при обнаружении новой строки / файла и отображение соответствующий вывод / уведомление.
2 голосов
/ 03 октября 2013

Взгляните на эту статью .В зависимости от того, что вы делаете, это может быть намного лучше, чем задание CRON, особенно если вы хотите немедленно предпринять действия .Задания CRON ограничены выполнением не более одного раза в минуту. При таком подходе вы можете немедленно начать обработку запроса в фоновом режиме.

// this script can run forever
set_time_limit(0);
 
// tell the client the request has finished processing
header('Location: index.php');  // redirect (optional)
header('Status: 200');          // status code
header('Connection: close');    // disconnect
 
// clear ob stack 
@ob_end_clean();
 
// continue processing once client disconnects
ignore_user_abort();
 
ob_start();
/* ------------------------------------------*/
/* this is where regular request code goes.. */
 
/* end where regular request code runs..     */
/* ------------------------------------------*/
$iSize = ob_get_length();
header("Content-Length: $iSize");
 
// if the session needs to be closed, persist it
// before closing the connection to avoid race
// conditions in the case of a redirect above
session_write_close();
 
// send the response payload to the client
@ob_end_flush();
flush();
 
/* -------------------------------------------*/
/* code here runs after the client disconnect */
...