Я работаю над онлайн-приложением PHP, которое нуждается в задержке события PHP. В основном мне нужно иметь возможность выполнять произвольный PHP-код за несколько секунд (но это может быть дни) после первого попадания на URL-адрес. Мне нужно довольно точное выполнение этого события PHP, также я хочу, чтобы он был достаточно масштабируемым. Я пытаюсь избежать необходимости планировать работу cron для запуска каждую секунду. Я смотрел Gearman, но, похоже, он не дает возможности планировать события и, как я понимаю, PHP на самом деле предназначенный для запуска в качестве демона.
Было бы идеально, если бы я мог сказать некоторому внешнему процессу опросить URL-адрес "checker" на сервере PHP в то время, когда должно быть запущено следующее событие. Это время опроса должно будет иметь возможность уменьшаться или увеличиваться по желанию, поскольку событие может быть удалено и добавлено в очередь и. Любые идеи об изящном способе выполнения этого? Просто нужно много накладных расходов при вызове PHP извне (необходимость анализировать HTTP-запрос или вызов через CLI), чтобы сделать эту идею выполнимой для моих нужд.
Мой текущий план - написать демона PHP, который будет запускать событие и взаимодействовать с ним с сервера PHP с помощью ретранслятора. Демон PHP будет строиться вокруг SplMinHeap, поэтому, надеюсь, производительность не будет плохой. Эта идея оставляет плохой вкус во рту, и мне было интересно, есть ли у кого-то лучшая идея? Идеи немного изменились. Прочитайте Правка 2.
EDIT:
Я создаю онлайн-игру, которая развивает игроков по очереди с переменным сроком. Я использую XMPP и BOSH, чтобы разрешить мне отправлять сообщения от моих клиентов, но у меня есть эта часть, все сделано и работает. Теперь я пытаюсь добавить произвольное событие, которое запускает после игры от клиента, чтобы позволить клиенту (и другому ppl в игре), который он взял долго. Я не могу использовать синхронизированный триггер на стороне клиента, потому что он будет использоваться (поскольку клиент может играть сам по себе). Надеюсь, что это поможет.
ИЗМЕНИТЬ 2:
Спасибо всем за ваши отзывы. Хотя я думаю, что большинство ваших идей будут хорошо работать в небольших масштабах, у меня есть ощущение, что они не будут масштабироваться очень хорошо (менеджер внешних событий) или не будут обладать точностью, требуемой для этого проекта (CRON). Кроме того, в обоих случаях они являются внешними частями, которые могут потерпеть неудачу и добавить сложность в уже сложную систему.
Я лично считаю, что единственным чистым решением, отвечающим требованиям этого проекта, является создание PHP-демона, который обрабатывает задержанные события. Я начал писать то, что я считаю первым PHP runloop. Он обрабатывает просмотр сокетов и выполняет отложенные события PHP. Надеюсь, когда я буду ближе к этому проекту, я могу опубликовать источник, если кто-то из вас заинтересован в этом. Пока что тестирование оказалось перспективным решением (никаких проблем с утечкой памяти или нестабильностью).
ИЗМЕНИТЬ 3: Вот ссылка на библиотеку циклов событий PHP, называемую LooPHP для тех, кто заинтересован.
Требования к TL; DR
- Вызов (желательно изначально) PHP с задержкой (от секунд до нескольких дней)
- Создавать/обновлять/удалять события произвольно (я ожидаю большой объем отмененного вызова).
- Управлять высокой загрузкой запланированных событий (100-1000 секунд на сервер)
- Вызовы должны быть в пределах одной секунды от запланированного времени
- В этот момент я не могу переписать базу кода на другой язык (возможно, когда-нибудь я буду)