我的开发环境是基于laravel官方推荐的homestead虚拟机
首先执行 composer require workerman/workerman 安装workerman
artisan command实现
因为workerman服务启动是基于cli命令行模式,所以我们得用laravel的artisan来实现.
创建command
php artisan make:command WorkermanHttpserver
注册command
App\Console\Kernel.php文件添加刚才创建的command
protected $commands = [
Commands\WorkermanHttpServer::class
];
以下例子是创建一个简单的httpserver.其他服务请查看官方文档.
参考官方文档,在WorkermanHttpServer.php 中写如下内容:
<?phpnamespace App\Console\Commands;use Illuminate\Console\Command;use Workerman\Worker;use App;class WorkermanHttpServer extends Command{protected $httpserver;/*** The name and signature of the console command.** @var string*/protected $signature = 'workerman:httpserver {action} {--daemonize}';/*** The console command description.** @var string*/protected $description = 'workerman httpserver';/*** Create a new command instance.** @return void*/public function __construct(){parent::__construct();}/*** Execute the console command.** @return mixed*/public function handle(){//因为workerman需要带参数 所以得强制修改global $argv;$action=$this->argument('action');if(!in_array($action,['start','stop'])){$this->error('Error Arguments');exit;}$argv[0]='workerman:httpserver';$argv[1]=$action;$argv[2]=$this->option('daemonize')?'-d':'';$this->httpserver=new Worker('http://0.0.0.0:8080');// App::instance('workerman:httpserver',$this->httpserver);$this->httpserver->onMessage=function($connection,$data){$connection->send('laravel workerman hello world');};Worker::runAll();}}
运行command
php artisan workerman:httpserver start
php artisan workerman:httpserver start --daemonize //常驻后台运行
整合gatewayworker
1.安装 Gateway-worker
由于要使用客户端点对点通讯,选择了 workerman/gateway-worker 的扩展包,它已经引入了 workerman/workerman 。
$ composer require workerman/gateway-worker
2.创建 Workerman 启动文件
创建一个 artisan 命令行工具来启动 Socket 服务端,在 app/Console/Commands 目录下建立命令行文件。
<?php namespace App\Console\Commands; use GatewayWorker\BusinessWorker; use GatewayWorker\Gateway; use GatewayWorker\Register; use Illuminate\Console\Command; use Workerman\Worker; class WorkermanCommand extends Command { protected $signature = 'workman {action} {--d}'; protected $description = 'Start a Workerman server.'; public function handle() { global $argv; $action = $this->argument('action'); $argv[0] = 'wk'; $argv[1] = $action; $argv[2] = $this->option('d') ? '-d' : ''; $this->start(); } private function start() { $this->startGateWay(); $this->startBusinessWorker(); $this->startRegister(); Worker::runAll(); } private function startBusinessWorker() { $worker = new BusinessWorker(); $worker->name = 'BusinessWorker'; $worker->count = 1; $worker->registerAddress = '127.0.0.1:1236'; $worker->eventHandler = \App\Workerman\Events::class; } private function startGateWay() { $gateway = new Gateway("websocket://0.0.0.0:2346"); $gateway->name = 'Gateway'; $gateway->count = 1; $gateway->lanIp = '127.0.0.1'; $gateway->startPort = 2300; $gateway->pingInterval = 30; $gateway->pingNotResponseLimit = 0; $gateway->pingData = '{"type":"@heart@"}'; $gateway->registerAddress = 