我的开发环境是基于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 中写如下内容:
<?php
namespace 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 =