RuslanIbragimov
@RuslanIbragimov
PHP developer & Entrepreneur

Как запустить очередь Beanstalk с помощью Cron?

очередь нужна для отправки электронных писем пользователям, уведомления и т д
если я поставлю задачу крону запускать скрипт обработчика очереди например каждую минуту то у меня может параллельно запуститься несколько процессов так как в какой то момент в очереди может быть большое количество задач и они просто не успеют выполниться пока не запуститься другой процесс
и может быть так что два процесса дернут одну и ту же задачу пока еще не будет удалена из очереди
можно ли как то запускать этот скрипт последовательно, то есть желательно вообще без задержки а как только один завершился сразу запускается следующий?
  • Вопрос задан
  • 183 просмотра
Решения вопроса 1
RuslanIbragimov
@RuslanIbragimov Автор вопроса
PHP developer & Entrepreneur
сделал так. пришлось сделать задержку в 5 секунд внутри php скрипта потому что systemd ругался что приходится слишком часто перезапускать процесс
[Unit]
After=network.target
Description=Runs worker
[Service]
ExecStart=/usr/bin/php7.0 /vagrant/www/public/deployer/app/cli.php
PIDFile=/vagrant/www/public/deployer/app/cli_bean.pid
TimeoutStopSec=300
Restart=always
[Install]
WantedBy=multi-user.target
Alias=bean.service


код задачи в  cli фалкона
use Phalcon\Cli\Task;

class MainTask extends Task
{
    public function mainAction()
    {
        $this->queue->watch('mail');
        while ($this->queue->statsTube('mail')["current-jobs-ready"] > 0 && ($job = $this->queue->reserve())) {
            $message = $job->getBody();
            $mailer = $this->mailer->send($message['to'], $message['subject'] , $message['view'], $message['params']);
            $job->delete();
        }
        $this->mailer->close();

        sleep(5);
    }
}


systemctl status
beanworker.service - Runs worker
   Loaded: loaded (/etc/systemd/system/beanworker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-11-03 20:21:05 MSK; 1s ago
 Main PID: 23075 (php7.0)
    Tasks: 1
   Memory: 9.4M
      CPU: 87ms
   CGroup: /system.slice/beanworker.service
           └─23075 /usr/bin/php7.0 /vagrant/www/public/deployer/app/cli.php

Nov 03 20:21:05 vagrant systemd[1]: beanworker.service: Service hold-off time over, scheduling restart.
Nov 03 20:21:05 vagrant systemd[1]: Stopped Runs worker.
Nov 03 20:21:05 vagrant systemd[1]: Started Runs worker.

 память съедает почти 10мб, а  php  memory_get_peak_usage выдает 2мб
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Wol_fi
php, js, mysql, highload
Можно без крона сделать бесконечный процесс через pcntl_fork();
Запускаете процесс, он обрабатывает задачу из очереди, рождает дочерний процесс, а сам закрывается. Дочерний процесс повторяет весь этот круг. Готовых реализаций в сети куча.
Плюсы: чистый пхп, не требуется крон, память не течёт.
Минусы: очень сложно синхронизировать несколько таких процессов между собой.

Можно использовать очередь задач, например тот же rabbitmq
Плюсы: легко синхронизировать процессы воркеров, воркеры могут быть написаны на чем угодно
Минусы: плюс одна технология в стек
Ответ написан
Ваш ответ на вопрос

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

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