目前,我正在开展一个项目,我将电子邮件排入队列。但是我想知道运行队列侦听器的“最佳方法”是什么。现在我只知道nohup
方式。
但是,通过使用nohup
,感觉队列侦听器不再是应用程序的一部分。这就像使用调度程序使您的cronjobs更多地成为应用程序的一部分。
还有其他方法可以收听队列吗?您的偏好是什么?
答案 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社区开发和支持了很长一段时间 - 你应该真的使用它们。