使用 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/

本帖已被设为精华帖!
本帖由系统于 4年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 6

在目前来看swoole是php的未来

4年前 评论
assimon (楼主) 4年前
Double-Jin (作者) 4年前
mamahaha 4年前
Double-Jin (作者) 4年前

这和你直接命令行执行有什么区别。。。

4年前 评论
颠倒的玉石

用supervisor多好,还能自动重启

4年前 评论

你使用 Workerman 作为 Laravel 队列进程守护,那么你准备用什么作为Workerman 的进程守护?

4年前 评论
assimon (楼主) 4年前
方圆百里找对手 (作者) 4年前

建议supervisor 或者pm2,还能记录日志和自动重启。你这种方式直接命令行执行确实没区别啊,要后台执行直接命令后面加个&,岂不更简单,就是没有日志和自动重启

4年前 评论
assimon (楼主) 4年前

php start_worker.php start -d 常驻内存启动

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!