在Ubuntu 16.04上使用Beanstalk和Supervisor管理Laravel工作队列

・9 分钟阅读

Beanstalk是一个快速而简单的工作队列,它允许你异步运行耗时的任务,比如,发送电子邮件,连接外部API或处理图像,这样做,你会减少你的网络应用程序延迟,Laravel为Beanstack提供开箱即用的支持,

本教程会安装beanstalkd,安装一个演示Laravel应用程序,并通过管理员 ,演示应用程序会从API获得一个可用OSes列表,并随机选择一个。

假设你的系统上已经安装了Supervisor,如果没有,应阅读有关如何设置Supervisor的以下教程: 在Ubuntu 16.04上安装和配置Supervisor

这里也假设你具有实例的SSH访问权限。

安装Beanstalk

要采取的第一步是安装beanstalkd


sudo apt-get update
sudo apt-get install beanstalkd

启动服务。


sudo systemctl start beanstalkd

还可以使服务在系统初始化时启动。


sudo systemctl enable beanstalkd

通过发出以下命令检查服务状态。


sudo systemctl status beanstalkd

默认情况下,beanstalkd侦听端口11300 ,Beanstalk使用一个简单的基于文本的协议描述它是github仓库 ,你可以通过运行telnet来测试它的协议。


telnet localhost 11300

写入以下内容并按回车。

 
list-tubes

 

你应该会看到服务器上可用的管道列表:

 
OK 14
---
- default

 

要关闭连接,只需键入quit,然后按ENTER键。

项目示例

我们首先需要安装它的依赖项来构建例子项目,我们将安装PHP和Composer 。


sudo apt-get install php php-mbstring php-xml php-common php-zip composer

现在,基于Laravel 5.5创建项目。


composer create-project --prefer-dist laravel/laravel vultr"5.5.*"

cd进入最近创建的文件夹,现在,我们会从这个目录中工作,此文件夹稍后可能被引用为PROJECT_ROOT

 
cd vultr/

 

要在Laravel中使用Beanstalk,我们需要再安装一个依赖项,PHP Beanstalk客户端。


composer require pda/pheanstalk ~3.0

我们还需要创建一个Job。在Laravel中,这是app/Jobs文件夹中的类,Laravel有一个控制台命令来帮助我们创建作业类,让我们创建例子作业。


php artisan make:job FindFavoriteOS

app/Jobs/FindFavoriteOS.php文件更新为下列内容。


<?php

namespace AppJobs;

use IlluminateBusQueueable;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateSupportFacadesLog;

class FindFavoriteOS implements ShouldQueue
{
 use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

 /**
 * Create a new job instance.
 *
 * @return void
 */
 public function __construct()
 {
 //
 }

 /**
 * Execute the job.
 *
 * @return void
 */
 public function handle()
 {
 $rawData = file_get_contents('https://api.vultr.com/v1/os/list');
 $list = json_decode($rawData, true);
 shuffle($list);
 $key = array_rand($list);
 $favorite = $list[$key];
 Log::info('My Favorite OS is: ' . $favorite['name']);
 }
}

handle方法是在使用作业时有效执行的方法。在这里,我们从API获取数据,随机选择一个操作系统,并将选择的操作系统写入日志文件。日志文件位于storage/logs/laravel.log处。

我们已经安装了Beanstalk,并且定义了要由它执行的作业,现在,是时候告诉Laravel将Beanstalk用作默认工作队列了,复制Laravel安装提供的默认.env文件。

 
cp .env.example .env

 

现在打开.env文件,并且更新指定了队列驱动程序的行。


QUEUE_DRIVER=beanstalkd

最后,生成应用程序密钥。


php artisan key:generate

现在,我们准备将作业分派到Beanstalk工作队列。

调度和运行作业

在Laravel中分派作业非常简单,更新routes/web.php文件。


<?php

Route::get('/', function () {
 for ($i = 0; $i < 50; $i++) {
 AppJobsFindFavoriteOS::dispatch();
 }

 return '50 Jobs dispatched!';
});


php artisan serve --host 0.0.0.0 --port 8000

现在在网络浏览器中,导航到http://[vultr-instance-ip]:8000 ,你将看到以下消息。

在你的服务器和项目root中打开一个新的SSH连接,执行以下命令。


php artisan queue:work --once

这是预期的输出:


[2018-02-14 00:03:52] Processing: AppJobsFindFavoriteOS
[2018-02-14 00:03:53] Processed: AppJobsFindFavoriteOS

确认已生成日志。


cat storage/logs/laravel.log

配置管理员

为了避免手工处理队列,我们会使用supervisord ,在/etc/supervisor/conf.d/vultr.conf中创建以下程序配置。


[program:vultr]
process_name=%(program_name)s_%(process_num)02d
command=php [PROJECT_ROOT]/artisan queue:work
autostart=true
autorestart=true
numprocs=8
redirect_stderr=true
stdout_logfile=/var/log/worker.log

请注意,放置Supervisor配置文件的正确路径取决于你的设置,另外,记住将[PROJECT_ROOT]替换为你系统上PROJECT_ROOT的完整路径。

在这里我们将配置Supervisor,以自动开始处理队列,并在脚本断开时重新启动它,还要注意,我们不是实例化一个worker,而是8个进程,你可以根据自己的应用程序自由地实例化所需的进程。

允许Supervisor管理worker,强制其重新读取其配置。


sudo supervisorctl reread
sudo supervisorctl update

如果管理员服务还没有启动,你需要启动它。


sudo systemctl start supervisord

现在让我们看看作业是否正在处理。


tail -f storage/logs/laravel.log

在网络浏览器上,导航到http://[vultr-instance-ip]:8000 ,你将看到在控制台上生成的日志。

结束语

我们已成功配置Laravel应用程序,以便将Beanstalk用作工作队列。此外,我们还演示了如何使用Supervisor管理worker。

Haojinghui profile image