由于最近想写一个新项目,打算依靠 Gateway Worker 的分布式部署以及 Laravel 的生态。
我的需求是只需要部署 Business Worker,不需要 Gateway 以及 Register。
依赖安装
首先,我们得安装 Gateway Worker。
composer require workerman/gateway-worker
composer require workerman/gatewayclient
gateway-worker 是 Gateway Worker 本体,Gateway client 是用于连接 Gateway worker 的。
至于为何要连接,那是在 Event 事件之外处理时,需要连接到 Gateway worker 来执行操作。比如队列中给用户发送消息(本示例中并没有用到)。
创建命令
这里我将创建一个 Worker 命令。
php application make:command WorkerCommand
随后编辑该文件。
<?php
namespace App\Commands;
use Workerman\Worker;
use GatewayWorker\BusinessWorker;
use LaravelZero\Framework\Commands\Command;
class WorkerCommand extends Command
{
/**
* The signature of the command.
*
* @var string
*/
protected $signature = 'worker {action=start} {--daemon}';
/**
* The description of the command.
*
* @var string
*/
protected $description = '启动 Gateway Business Worker';
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
global $argv;
if (!in_array($action = $this->argument('action'), ['start', 'stop', 'restart'])) {
$this->error('Error Arguments');
return Command::FAILURE;
}
$argv[0] = 'worker';
$argv[1] = $action;
$argv[2] = $this->option('daemon') ? '-d' : '';
$this->startBusinessWorker();
}
private function startBusinessWorker()
{
$worker = new BusinessWorker();
$worker->name = 'BusinessWorker';
$worker->count = 2;
$worker->registerAddress = '127.0.0.1:1236'; // Register 的地址,注意修改
$worker->eventHandler = \App\GatewayWorker\Events::class; // 你的 Event 类
Worker::runAll();
}
}
启动
php application worker
可用参数
这个命令中,我们可以使用以下参数。
php application worker start // 启动
php application worker stop // 停止
php application worker reload // 重载
php application worker start -d // 以 daemon 模式运行。