如何监视Laravel队列是否正在运行?

如何监视Laravel队列是否正在运行?,laravel,laravel-5.1,Laravel,Laravel 5.1,我可以这样启动队列: php artisan queue:listen 这很好,但我想监控队列是否正在运行,尤其重要的是,如果队列没有运行,似乎不会出现回退 明确地说,如果我通过控制器将电子邮件排队,如下所示: $this->mailer->queue($view, $data, function ($message) use ($toEmail, $toName, $subject) { $message ->to($toEmail, $toName

我可以这样启动队列:

php artisan queue:listen
这很好,但我想监控队列是否正在运行,尤其重要的是,如果队列没有运行,似乎不会出现回退

明确地说,如果我通过控制器将电子邮件排队,如下所示:

$this->mailer->queue($view, $data, function ($message) use ($toEmail, $toName, $subject) {
    $message
        ->to($toEmail, $toName)
        ->subject($subject);
    });
这将成功运行,但如果队列未“侦听”,作业将永远推送到作业表中


我正在寻找类似于
\Queue::isListening()的东西

实际上,当队列失败时,会触发一个
失败
事件,因此,例如,您可以在
AppServiceProvider
类的
boot
方法中注册
失败
事件,如下所示:

public function boot()
{
    Queue::failing(function (JobFailed $event) {
        // $event->connectionName
        // $event->job
        // $event->data
    });
}
[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/home/someDirName/www/example.com/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/tmp/supervisord.pid
nodaemon=false
loglevel=warn

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock

[program:queue]
command=/usr/local/bin/php artisan queue:listen --tries=3
directory=/home/someDirName/www/example.com
autostart=true
autorestart=true
redirect_stderr=true
或者,您可以在
处理程序
类中声明
失败的
方法,例如:

class SendEmail extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    public function handle(Mailer $mailer)
    {
        //...
    }


    public function failed()
    {
        //...
    }
}
[program:queue]
command=/usr/local/bin/php artisan queue:listen --tries=3

关于后台监控,您可以使用: Supervisor是一个客户机/服务器系统,允许其用户进行监视 并在类UNIX操作系统上控制许多进程

在这种情况下,您必须将其安装到您的计算机上,并使用至少一个
程序
部分对其进行配置,例如:

class SendEmail extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    public function handle(Mailer $mailer)
    {
        //...
    }


    public function failed()
    {
        //...
    }
}
[program:queue]
command=/usr/local/bin/php artisan queue:listen --tries=3
这是
程序
部分的一个示例,我曾使用
Supervisord
监视我的
队列
。在这种情况下,您需要阅读文档以了解如何使用它,我刚刚给了您一个想法。启动后,
supervisord
将在后台运行,即使服务器重新启动(如果由于某种原因停机),它也会重新启动观察,因此您无需担心

简单(最小)配置文件可能如下所示:

public function boot()
{
    Queue::failing(function (JobFailed $event) {
        // $event->connectionName
        // $event->job
        // $event->data
    });
}
[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/home/someDirName/www/example.com/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/tmp/supervisord.pid
nodaemon=false
loglevel=warn

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock

[program:queue]
command=/usr/local/bin/php artisan queue:listen --tries=3
directory=/home/someDirName/www/example.com
autostart=true
autorestart=true
redirect_stderr=true

好吧,你可以阅读文档来真正了解它。这可能会帮助你开始。

没有像你说的那样的方法

\队列::isListening()

但您可以配置:一个进程控制系统来管理您的队列。下面是一个用于管理器配置的Laravel文档

这是一个较低的级别,但同样,您可以运行命令,如
ps-aux | grep queue
,在您的应用程序/队列工作者运行的任何服务器上查看正在运行的队列进程。

我知道您要去哪里(我目前正在使用supervisord)-但我想基本上对系统进行健康检查。我想我可以利用你在那里的第一个事件技巧,故意创建一个假队列项目,然后听听它是否失败。@Chris你找到解决方案了吗?我的主机提供商不允许我使用Supervisord,因为它与其他东西冲突(不知道是什么),这应该更高,它最好地回答了这个问题。非常感谢。