“最佳方式”运行Laravel队列侦听

时间:2016-09-07 10:23:11

标签: laravel queue listener

目前,我正在开展一个项目,我将电子邮件排入队列。但是我想知道运行队列侦听器的“最佳方法”是什么。现在我只知道nohup方式。

但是,通过使用nohup,感觉队列侦听器不再是应用程序的一部分。这就像使用调度程序使您的cronjobs更多地成为应用程序的一部分。

还有其他方法可以收听队列吗?您的偏好是什么?

2 个答案:

答案 0 :(得分:3)

以下是我为实现这一目标所写的内容:

应用/控制台/命令/ QueueProcessListener.php

exec("chmod -R 0777 masterFile");

应用/控制台/ Kernel.php

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class QueueProcessListener extends Command
{
    /**
     * The name of the command/process we want to monitor. This string will be used both to check to see if the process
     * is currently running and to spawn it (The arguments are appended to it).
     *
     * @var string
     */
    protected $command = 'php artisan queue:listen';

    /**
     * The arguments to pass to the process when spawning it.
     *
     * @var string
     */
    protected $arguments = '--tries=3';

    /**
     * The signature of the console command. We use the signature when running it through Artisan: php artisan $signature
     *
     * @var string
     */
    protected $signature = 'queue-process-listener';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Monitor the queue listener process to ensure it is always running.';

    /**
     * Create a new command instance.
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        if (!$this->isProcessRunning($this->command)) {
            $this->info("Starting queue listener.");
            $this->executeShellCommand($this->command, $this->arguments, true);
        } else {
            $this->info("Queue listener is running.");
        }
    }

    /**
     * Execute a shell command, with the provided arguments, and optionally in the background. Commands that are not run
     * in the background will return their output/response.
     *
     * @param $command
     * @param string $arguments
     * @param bool $background
     * @return string
     */
    public function executeShellCommand($command, $arguments = '', $background = false)
    {
        $command = trim($command);
        if (!is_string($command) || empty($command)) {
            return null;
        }

        $arguments = trim($arguments);

        $cmd = trim($command . ' ' . $arguments) . ($background ? ' > /dev/null 2>/dev/null &' : '');
        return shell_exec($cmd);
    }

    /**
     * Check if a process is running using pgrep.
     *
     * @param $process
     * @return bool
     */
    public function isProcessRunning($process)
    {
        $output = $this->executeShellCommand('pgrep -f "' . $process . '"');

        return !empty(trim($output));
    }
}

答案 1 :(得分:0)

文档告诉您如何实现此目的: https://laravel.com/docs/5.3/queues#supervisor-configuration

我不确定你的意思是它不是“应用程序的一部分”。 Crons和后台工作进程是任何扩展服务器体系结构的标准部分。使用它们并没有错。

你也应该真的避免做Jonathon的回答所暗示的,这基本上是在php中编写你自己的supervisord。如果您的服务器重新启动怎么办?对于这个问题有经过实战考验的解决方案,已经由linux社区开发和支持了很长一段时间 - 你应该真的使用它们。