Как реализовать очередь заданий на PHP?

Есть скрипт, который проверяет список URL, на каждую ссылку уходит примерно около секунды. Если ввести много ссылок - скрипт может выполняться очень долго, поэтому хотелось бы как-нибудь разбить его выполнение на части. Особенно если одновременно будут проверять несколько человек - нагрузка на сервер будет не маленькой.
Как лучше реализовать такое? Не хочется изобретать велосипед, скорее всего уже есть что-нибудь готовое, у меня пока такая идея:
1) Пользователь добавляет список урл, они записываются как задания в базу со статусом "не проверено". На странице отображается статус "не выполнено".
2) Второй скрипт по крону проверяет наличие не сделанных заданий, если они есть - начинает выполнять их по очереди небольшими партиями и записывать результат в MySQL, менять статус на "проверено". Тут еще нужно будет сделать повторную проверку ошибок, если не удалось проверить урл, запись в лог.
3) Когда результат для всех введенных ссылок готов, пользователь видит статус задания "выполнено", и может посмотреть результаты.
Адрес проекта:
https://turstory.com/viza/finlyandiya
  • Вопрос задан
  • 5769 просмотров
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Смотрите в сторону сервера очередей (ZMQ, RabbitMQ, Gearman)
Ответ написан
Комментировать
@v_prom
лучше, будет, если php будет эти данные отдавать какой-то проге, которая будет это делать в много потоков (можно написать на c++ или python), а потом отдавать результат на страницу через ajax.
Ответ написан
Комментировать
alekciy
@alekciy
Вёбных дел мастер
Преложенные выше серверы очередей хорошо, но есть минус. Для данной задача оно избыточно. Как минимум придется раскуриться настройкой сервера и как с ним взаимодействовать.

Предложенная схема с базой неплохая, но в ней потенциально заложена повторная проверка если п.2 запускается в несколько копий. Поэтому более правильный вариант это использовать Redis. У меня так: Как сделать «фоновый» парсинг?

Т.е. смысл в том, что бы очередь url на загрузку формировалась в однопоточном режиме, а сами закачки многопоточны. Тогда скрипт качающий страницы может быть запушен в стольких копиях, сколько у вас потянет сервер и не нужно будет боятся повторной загрузки (у меня каждую минуту запускается новая копия скрипта и так до тех пор, пока очередь не станет пустой). Схема крайне легко маштабируется как в рамках одного сервера, так и нескольких.
Ответ написан
Комментировать
akubintsev
@akubintsev
Опытный backend разработчик
Можно прибегнуть к помощи ReactPHP для создания асинхронных неблокируемых запросов и обработок. Есть иллюстрация в виде примера реализации прокси https://github.com/kryoz/socket2http.
Можно настроить прием входных данных через запрос, либо сделать циклический таймер для опроса очереди задач скажем из таблицы в БД.
В сущности это аналог того, что предложил @alekciy, но с меньшими накладными расходами на ресурсы системы.
Ответ написан
Ваш ответ на вопрос

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

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