Параллелизм PHP через Cron
У меня есть несколько сценариев, которые должны выполняться одновременно как отдельные процессы. Мой план состоит в том, чтобы создать задание cron, которое выполняет несколько экземпляров этих сценариев с заданным интервалом. Это хорошая идея? Каковы плюсы/минусы такого подхода? Есть ли какие-либо другие варианты, которые мне нужно рассмотреть?
Итог: Я пытаюсь имитировать многопоточность. Любые условия гонки будут обрабатываться с помощью кода (например, установка статусов в БД и т.д.). Предполагается, что сценарии выполняют задачи с интенсивной обработкой (например, создание эскизов и т.д.).
5 answers
Вы можете использовать разветвление. Сценарий запуска загрузит все конфигурации и инициализации по умолчанию, а затем разветвляет дочерние процессы для выполнения обработки. Затем он может отслеживать процессы, чтобы убедиться, что они все еще запущены. http://php.net/manual/en/function.pcntl-fork.php
Что ж, если тебе это нужно как работа для друзей, давай. Если вам нужно несколько процессов, вы, скорее всего, захотите использовать pcntl_fork для создания нескольких экземпляров одного и того же сценария.
В зависимости от того, насколько быстро вы хотите реагировать на эти задания, и если вы хотите выполнять задачи с интенсивным использованием процессора, вы также можете распределить эту обработку с помощью системы очередей. Проверьте Gearman или beanstalkd с несколькими рабочими на машину, если у вас несколько ядер/процессоров.
Не имеет PHP fork()
? Хотя это на самом деле не многопоточность, это основной способ совместной работы.
Одним из недостатков использования cron является то, что он будет выполнять копию вашего скрипта с заданным интервалом, независимо от того, сколько процессов скрипта уже запущено. Это означает, что сценариям нужен способ взаимодействия друг с другом, чтобы одновременно выполнялось не более N сценариев (избыточные сценарии могут просто немедленно завершиться).
Альтернативой cron может быть супервизор, который будет выполнять настраиваемое количество сценариев и отслеживать каждый из них, чтобы любой выход был возродился.