使用 Workerman 作为 Laravel 队列进程守护
无需安装 Supervisor ,使用 Workerman 来作为 Laravel 队列的进程守护!
workerman 简介:#
Workerman 是一款纯 PHP 开发的开源高性能的 PHP socket 服务框架。
Workerman 不是重复造轮子,它不是一个 MVC 框架,而是一个更底层更通用的 socket 服务框架,你可以用它开发 tcp 代理、梯子代理、做游戏服务器、邮件服务器、ftp 服务器、甚至开发一个 php 版本的 redis、php 版本的数据库、php 版本的 nginx、php 版本的 php-fpm 等等。 Workerman 可以说是 PHP 领域的一次创新,让开发者彻底摆脱了 PHP 只能做 WEB 的束缚。
第一步:安装 workerman#
composer require workerman/workerman
第二布:在 laravel 根目录下编写 start_worker.php 作为进程启动文件#
代码如下:
<?php
require_once 'vendor/autoload.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
Worker::$logFile = 'worker.log';
// 你网站项目根目录地址
$yourPath = getcwd();
$worker = new Worker();
// 启动8个进程
$worker->count = 8;
// 进程名称
$worker->name = 'queue-worker';
// 以什么用户启动
$worker->user = 'www';
$worker->onWorkerStart = function ($worker) use ($yourPath){
$cmd = 'sudo -u www php '. $yourPath . '/artisan queue:work --queue=emails,orderclean --sleep=3 --tries=3 $s >>worker.log &';
// 先查看进程是否存在
$execres = shell_exec('ps -ef|grep artisan|grep -v grep');
$shcount = shell_exec('ps -ef|grep artisan| wc -l');
if (!$execres || $shcount <= $worker->count) {
echo '进程不存在或小于设置数量,开始创建'.PHP_EOL;
$shellexec = shell_exec($cmd);
print_r($shellexec);
} else {
echo '进程存在,无需创建'.PHP_EOL;
}
// 起一个定时器,每3秒检测一次
if ($worker->id == 0) {
$time_interval = 3;
Timer::add($time_interval, function() use ($yourPath, $worker, $cmd)
{
try{
// 先查看进程是否存在
$execres = shell_exec('ps -ef|grep artisan|grep -v grep');
$shcount = shell_exec('ps -ef|grep artisan| wc -l');
if (!$execres || $shcount <= $worker->count) {
echo '进程不存在或小于设置数量,开始创建'.PHP_EOL;
$shellexec = shell_exec($cmd);
print_r($shellexec);
} else {
echo '进程够用,无需创建'.PHP_EOL;
}
} catch (Exception $exception) {
echo $exception->getMessage();
}
});
}
};
// 运行worker
Worker::runAll();
三:启动与停止#
php start_worker.php start 为调试启动,有错误会直接输入到控制台
php start_worker.php start -d 为常驻内存启动
php start_worker.php stop 为停止命令
启动后可在 worker.log 文件里面查询 workerman 及队列执行日志
更多请访问 Workerman 官方手册 http://doc.workerman.net/
推荐文章: