PHP Выполнять скрипт на фоне

212
29 ноября 2018, 03:00

Интересует вопрос как можно реализовать задуманное: Пользователь нажимает кнопку "Сбор данных", на фоне запускается мой скрипт, он делает свою работу, все записывает в бд, при этом пользователь может спокойно дальше гулять по сайту, а на странице где был запущен скрипт должна появится надпись "Собираем данные" например.

Буду рад любым статьям или примерам!

Answer 1

Вариант 1. Если у вас fast-cgi + php-fpm на сервере, то можно использовать функцию fastcgi_finish_request(); она отдает ответ браузеру, при этом скрипт продолжает выполняться на сервере, периодически записывая куда-то состояние выполнения задачи

Вариант 2. Серверы очередей (например rabbitMQ). Ваш web-скрипт бросает задачу в очередь. Отдельно запущенный на сервере скрипт мониторит очередь и выполняет появившуюся задачу, периодически записывая куда-то состояние выполнения задачи

Вариант 3. На сервере, на локалхосте и неиспользуемом порту запускаете еще один веб-сервер, с большими параметрами таймаута на выполнение скриптов. Ваш скрипт просто бросает задачу на 127.0.0.1:8888 и рапортует о постановке задачи. На локальном же сервере происходит выполнение, периодически записывая куда-то состояние выполнения задачи

Вариант 4. Добавляете задачу в некий список. По крону запускается скрипт, который выполняет их по списку, периодически записывая куда-то состояние выполнения задачи

Answer 2

Наиболее очевидное решение - ставится задача, PHP закидывает её в RabbitMQ. Из RabbitMQ её подхватывает подписанный на очередь демон, после чего выполняет и выставляет флаг, что задача выполнена. Можно в Redis по ID задачи или какому-то другому идентификатору, а можно прямо в базе.

Answer 3

Делается так:

  • Создаете табличку "Задачи", например
  • Пользователь нажимает кнопку "Сбор данных" - задача добавляется в таблицу "Задачи"
  • Скриптом берем задачу из таблицы, метим ее как "Выполняется". Соответственно пользователю выводится надпись "Собираем данные"
  • После выполнения, метим ее как выполненную или не выполненную
  • Сооответственное пользователю выводит результат выполнения задачи

Ну и выполнять это все можно с помощью cron

READ ALSO
laravel timestamps()

laravel timestamps()

В $table->timestamps(); создает два поля: create_at , update_atНо они по дефолту равны 0

169
Как добавить if к ALTER TABLE

Как добавить if к ALTER TABLE

Я пытаюсь создать базу данных журнала

237
Бот не отправляет сообщения VK API

Бот не отправляет сообщения VK API

Хочу написать своего бота для группы, но он не отправляет сообщения

185
Перебор и удаление дублей массива

Перебор и удаление дублей массива

Существует вот такой массив:

163