在Ubuntu 16.04上使用Beanstalk和Supervisor管理Laravel工作队列
Haojinghui
・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。