mysql — циклическая или рекурсивная PHP-функция с задержкой по времени Ветвление?

У меня есть функция PHP, которая должна быть выполнена ~ 10 секунд после определенных событий.

Функция, в свою очередь, может создать новый экземпляр события, который должен был бы снова вызвать функцию ~ 10 секунд спустя.

Часто функция не создает новое событие, но это возможно для цепочек длиной до ~ 1000. (10 000 секунд) Таким образом — я не думаю, что разумно содержать всю цепочку в одном циклическом php-процессе. (это неверно?)

В любой момент времени может быть до 100 отдельных экземпляров этих цепочек событий-функций, работающих одновременно.

Я проводил много исследований по responsephp / system_daemon / pcntl / fake-forking с exec () и другими потенциальными решениями. Хотите знать, что может быть лучшим решением для такого рода проблем.

Мне также понадобится какой-нибудь способ отловить разорванные цепочки или тайм-ауты длинных процессов, чтобы попытаться перезапустить их в 10-секундном окне.

Большое спасибо заранее.

1

Решение

Я бы посмотрел на Gearman. Это система на основе очередей. У вас есть рабочие потоки, которые выполняют фактическую обработку, и клиенты, которые передают информацию рабочим. Таким образом, вы можете, например, получить 10 веб-страниц одновременно. Это может быть полезно для вас, потому что вы можете запрограммировать его на выполнение 5 итераций, а затем перезапустить (чтобы предотвратить утечки памяти или зависание).

Я использовал его на серверах Ubuntu и CentOS с большим успехом. Независимо от того, выполняете ли вы почтовые очереди или подключаетесь к API, для которого требуется одновременный запуск только одного вызова, это отлично подходит для этих задач.

РЕДАКТИРОВАТЬ: Вы также можете запустить Java, Python или другие языки программирования, которые начинаются с клиента PHP. Отлично подходит для соединения различных языков программирования вместе. Если вы боитесь утечек памяти, я бы попробовал и на обработку на другом языке. Но я понятия не имею, какова ваша конечная задача, поэтому я не смогу помочь гораздо больше, чем эта.

2

Другие решения

10 секунд — это долгое время, поэтому я бы сохранил его в очереди в MySQL, которая содержит самое раннее время выполнения и информацию о событии, возможно, в сериализованной форме. Это означает, что есть примерно 10 секунд, а может быть и 11 секунд, и что даже 12 секунд не означают, что они будут разрушительными.

Стол выглядит просто как

create table stored_events (start_at datetime, event text);

Вы читаете в 1-й очереди

select * from stored_events where start_at <= now();

а ты пишешь

insert into stored_event set start_at = now() + interval 10 second, event='<event>'";
1

Вы рассматривали возможность использования задания cron и базы данных для управления установками php? Каждые 10 секунд можно запускать задание cron, проверять необходимость создания N установок и создавать их с помощью curl или fork.

0
По вопросам рекламы [email protected]