Beanstalk
是一个高性能、轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟。
安装与配置beanstalkd
安装
从官网下载最新版的源码,当前最新版为 1.10
。参考下面命令,编译安装。
1 | wget https://github.com/kr/beanstalkd/archive/v1.10.tar.gz |
上面将 beanstalkd
可执行程序放置在 /usr/local/bin/
目录下。
启动脚本
下面使用 systemctl
来配置启动脚本。
创建 /lib/systemd/system/beanstalkd.service
文件,写入以下内容(注意相关路径和配置参数):
1 | [Unit] |
安装beanstalkd console
beanstalkd console
是使用 php
语言编写的 beanstalkd
队列控制台程序。
从官网下载 beanstalk_console
安装包 ,下载完解压之后,部署个域名,注意 nginx
绑定的 root
的为 beanstalk_console
的 public
目录,然后修改 config.php
配置,为了安全起见建议启用 Basic Authentication
认证。
1 |
|
安装与配置supervisord
安装与基本配置
为了更好地管理 Laravel
相关队列服务进程,推荐使用 supervisord
工具,安装与配置方法如下:
1 | yum -y install python-setuptools |
supervisor
的配置文件放置在 /etc/supervisor/supervisord.conf
中。编辑它,在最后面修改添加上:
1 | [include] |
以后,supervisor
管理的服务进程脚本可以放在 /etc/supervisor/conf.d/
目录下,以 .conf
后缀名的文件中。
启动与服务脚本
创建 /lib/systemd/system/supervisor.service
文件,写入以下内容:
1 | [Unit] |
然后执行下面命令设置自动开机启动。
1 | systemctl enable supervisor.service |
创建 /etc/init.d/supervisor
脚本,写入以下内容。
1 |
|
注意修改上面脚本中 supervisor
配置文件路径(包括 PIDFILE
文件)为你的 supervisor
的配置文件里的相关路径。
然后,修改文件权限为 755
,并设置开机启动。
1 | chmod 755 /etc/init.d/supervisor |
后续,你就可以使用下面命令来管理 supervisor
了。
1 | service supervisor help |
更多其它 Linux
发行版开机启动脚本:https://github.com/Supervisor/initscripts 。
安装与配置Laravel
Laravel
安装与使用,这里不做过多赘述,参考社区中文文档。
Laravel
启用 beanstalkd
队列支持,需要依赖 pda/pheanstalk ~3.0
扩展包,请在 composer.json
追加上,然后 composer update
一下。修改 .env
文件,将 QUEUE_DRIVER=sync
由默认的同步 sync
改为 beanstalkd
。
1 | QUEUE_DRIVER=beanstalkd |
现在,你可以编写 supervisor
管理队列服务的脚本了。这里演示了一个名叫 laravel-worker
的 supervisor
进程管理的脚本示例,文件路径为 /etc/supervisor/conf.d/laravel-worker.conf
。
1 | [program:laravel-worker] |
其中 /usr/local/php/bin/php
为服务器中 php
二进制文件的绝对路径,/data/wwwroot/laravel/
为 Laravel
网站项目的路径,artisan queue:work beanstalkd --sleep=3 --tries=3 --queue=default --daemon
为队列处理器命令参数,它支持传入更多参数,请执行 php artisan queue:work --help
获取。以上参数请根据实际情况修改。
配置完上面,就可以使用 supervisorctl
来启用与重启 laravel-worker
了:
1 | supervisorctl reread |
为了实现队列平滑重启,建议手动运行
php artisan queue:restart
命令之后,再重启laravel-worker
。
1 | php artisan queue:restart |