Laravel使用Command引导启动 workerman(websocket)

1、安装workerman

composer require workerman/workerman

2、创建workerman启动文件

php artisan make:command Workerman

修改Workerman文件

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Workerman\Worker;

class Workerman extends Command
{
    protected $websocket;
    /**
     * 命令名称
     *
     * @var string
     */
    protected $signature = 'workerman:websocket {action} {--daemonize}';
    /**
     * 说明描述
     *
     * @var string
     */
    protected $description = 'workerman websocket';
    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     */
    public function handle()
    {
        global $argv;
        $action=$this->argument('action');
        $argv[0]='workerman:websocket';
        $argv[1]=$action;
        $argv[2]=$this->option('daemonize')?'-d':'';
        $ws_worker = new Worker('websocket://0.0.0.0:2000');
        $ws_worker->onMessage=function($connection,$data){
            $connection->send('laravel workerman hello world');
        };
        Worker::runAll();
    }
}

3、注册启动文件

在app/Console/Kernel.php中添加以下代码

    protected $commands = [
        //
        Commands\Workerman::class
    ];

4、命令行启动workerman

php artisan workerman:websocket start

5、启动成功效果

Workerman[workerman:websocket] start in DEBUG mode
------------------------------------------- WORKERMAN --------------------------------------------
Workerman version:4.0.22          PHP version:7.4.0
-------------------------------------------- WORKERS ---------------------------------------------
proto   user            worker          listen                      processes    status           
tcp     root            none            websocket://0.0.0.0:2000    1             [OK]            
--------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.

注意事项

上述环境在Linux下运行,如果在win下会出现无法监听,效果如下

----------------------- WORKERMAN -----------------------------
Workerman version:4.0.22          PHP version:7.4.3
------------------------ WORKERS -------------------------------
worker               listen                              processes status

解决方放

修改workerman下Worker.php文件中的getStartFilesForWindows函数

public static function getStartFilesForWindows() {
        global $argv;
        $files = array();
        _$file = $argv;
        $files = $file;
        return $files;
    }
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 2

public static function getStartFilesForWindows() {
global $argv;
$files = array();
// foreach($argv as $file)
// {
// if(is_file($file))
// {
// $files[$file] = $file;
// }
// }
$file = $argv[0];
$files[$file] = $file;
return $files;
}

2年前 评论

许多项目我都是独立使用 workman 做 websocket 服务器,使用 GatewayWorker 能快速开发相关功能,集成到 laravel 或者 tp 等 php 常规框架一起使用,能完美解决 websocket 通讯问题,实现了聊天室、客服,包括小程序中的各种实时交互与应用相关的功能。可以看 demo(https://element.wmhello.cn)

9个月前 评论

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