laravel 整合WorkerMan
我的开发环境是基于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-