【问题标题】:How should laravel queues set up properly for production with supervisor?laravel 队列应该如何与主管一起正确设置生产?
【发布时间】:2015-04-02 20:25:06
【问题描述】:

我正在尝试设置队列用于日志存储、电子邮件发送和其他任务。

我决定使用 beanstalkd 和 supervisor 来控制作业队列的执行。我用 composer 安装了 pda/pheanstalk ~2.0,在 app/config/queue.php 上进行了正确的设置,编写了我的 Queue 类并尝试执行任务。

这是一个例子,它是一个登录日志:

Auth::attempt(array(
                        'email' => $email,
                        'password' => $password
                        ));

if (Auth::check()) {
$debounce = Carbon::now()->addSeconds(10);
Queue::later($debounce, 'SaveAcessLog', array('user' =>  Auth::id(), 'ip' => Request::getClientIp()));
}

所以对于 supervisord,我关注了 this tutorial。安装后,我按照每个步骤操作并确保使laravel_queue.confrun_queue.sh 文件可执行。

问题是我无法执行任何任务。当我测试sudo supervisorctl 时,我得到:

laravel_queue                    FATAL      Exited too quickly (process log may have details)

访问 /var/log/supervisor/supervisord.log 处的 supervisord 日志文件显示:

2015-04-02 20:16:57,251 INFO supervisord started with pid 1269
2015-04-02 20:16:58,254 INFO spawned: 'laravel_queue' with pid 1316
2015-04-02 20:16:58,277 INFO exited: laravel_queue (exit status 127; not expected)
2015-04-02 20:16:59,279 INFO spawned: 'laravel_queue' with pid 1525
2015-04-02 20:16:59,287 INFO exited: laravel_queue (exit status 127; not expected)
2015-04-02 20:17:01,294 INFO spawned: 'laravel_queue' with pid 1753
2015-04-02 20:17:01,303 INFO exited: laravel_queue (exit status 127; not expected)
2015-04-02 20:17:04,658 INFO spawned: 'laravel_queue' with pid 1808
2015-04-02 20:17:04,668 INFO exited: laravel_queue (exit status 127; not expected)
2015-04-02 20:17:05,669 INFO gave up: laravel_queue entered FATAL state, too many start retries too quickly

所以,如果我尝试php artisan queue:work,任务将被执行!我的 supervisord 设置缺少什么?

注意

我愿意使用与 supervisord 不同的东西,以防它更简单或更高效。

【问题讨论】:

  • 我也有同样的问题...有什么解决办法吗?
  • 我当时真的做不到,我会再试一次,如果成功了告诉你,同样,如果你得到它,请告诉我!

标签: php laravel supervisord


【解决方案1】:

检查主管startsecs=0 是否有帮助。 Supervisor docs

我的配置:

[program:myqueue]
#command=php artisan queue:work --daemon --sleep=10 --verbose
command=php artisan queue:work --daemon --sleep=90 --tries=1 -vvv
## --timeout=0 --tries=0
#user=user
directory=/usr/share/nginx/laravel
stdout_logfile=/usr/share/nginx/laravel/app/storage/logs/myqueue_supervisord.log
redirect_stderr=true
autostart=true
startsecs=0
#autorestart=false
#startretries=0
#exitcodes=1

【讨论】:

    【解决方案2】:

    我知道这是一个老问题,但我在主管配置中使用 artisan queue:listen 运气更好,这样它就不会继续启动和停止进程,但如果由于某种原因停止,应该重新启动。

    更新

    这似乎不是最好的解决方案,我发现它大部分时间都会运行队列。但是,如果有很长一段时间没有要处理的工作,除非告诉主管重新启动工作人员,否则新工作似乎不会得到处理。

    更多更新

    我现在有一个类似于以下的配置:

    [program:worker]
    process_name=%(program_name)s_%(process_num)02d
    command=php artisan queue:work --sleep=3 --tries=3 --daemon
    autostart=true
    autorestart=true
    numprocs=8
    redirect_stderr=true
    startretries=10
    stdout_logfile=/dir/logs/worker.log
    

    好像效果不错,好久没有摔倒了。

    【讨论】:

    • 据我所知,使用 queue:work --daemon over queue:listen 有一个优势,因为守护进程在利用 CPU 方面效率很高 :)
    猜你喜欢
    • 2020-03-17
    • 2019-08-20
    • 1970-01-01
    • 2010-12-24
    • 2020-06-23
    • 1970-01-01
    • 2017-03-28
    • 2014-03-14
    • 1970-01-01
    相关资源
    最近更新 更多