使用 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/
本帖已被设为精华帖!
本帖由系统于 5年前 自动加精
在目前来看swoole是php的未来
这和你直接命令行执行有什么区别。。。
用supervisor多好,还能自动重启
你使用 Workerman 作为 Laravel 队列进程守护,那么你准备用什么作为Workerman 的进程守护?
建议supervisor 或者pm2,还能记录日志和自动重启。你这种方式直接命令行执行确实没区别啊,要后台执行直接命令后面加个&,岂不更简单,就是没有日志和自动重启
php start_worker.php start -d 常驻内存启动