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 协议》,转载必须注明作者和本文链接
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;
}
许多项目我都是独立使用 workman 做 websocket 服务器,使用 GatewayWorker 能快速开发相关功能,集成到 laravel 或者 tp 等 php 常规框架一起使用,能完美解决 websocket 通讯问题,实现了聊天室、客服,包括小程序中的各种实时交互与应用相关的功能。可以看 demo(https://element.wmhello.cn)