测试环境:win 7
think-worker默认有命令
php think worker:gateway
但是如果在win下运行,会报错
GatewayWorker Not Support On Windows
但是这并不是说gatewa不能再windows上运行,而是gateway需要启动好几个命令行,windows下无法直接处理,所以如果想要使用think-worker下的gateway,还需要改造下。
新建command命令,例如新建workman
php think make:command Workman
此时app目录下会新增一个command目录,下面会有一个Workman.php文件,修改这个文件。
文件内容来自网络,进行了一些调整,经测试可用。
<?php
declare(strict_types = 1);
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\facade\Config;
use Workerman\Worker;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
use GatewayWorker\Register;
class Workerman extends Command
{
protected function configure()
{
// 指令配置
$this->setName('workerman')
->addArgument('service', Argument::OPTIONAL, 'workerman service: gateway|register|businessworker', null)
->addOption('host', 'H', Option::VALUE_OPTIONAL, 'the host of workerman server', null)
->addOption('port', 'P', Option::VALUE_OPTIONAL, 'the port of workerman server', null)
->addOption('daemon', 'd', Option::VALUE_OPTIONAL, 'Run the workerman server in daemon mode.')
->setDescription('workerman Server for ThinkPHP');
}
public function execute(Input $input, Output $output)
{
$service = $input->getArgument('service');
$option = Config::get('gateway_worker');
if ($input->hasOption('host')) {
$host = $input->getOption('host');
} else {
$host = !empty($option['host']) ? $option['host'] : '0.0.0.0';
}
if ($input->hasOption('port')) {
$port = $input->getOption('port');
} else {
$port = !empty($option['port']) ? $option['port'] : '2347';
}
$registerAddress = !empty($option['registerAddress']) ? $option['registerAddress'] : '127.0.0.1:1236';
switch ($service) {
case 'register':
$this->register($registerAddress);
break;
case 'businessworker':
$this->businessWorker($registerAddress, isset($option['businessWorker']) ? $option['businessWorker'] : []);
break;
case 'gateway':
$this->gateway($registerAddress, $host, $port, $option);
break;
default:
$output->writeln("<error>Invalid argument action:{$service}, Expected gateway|register|businessworker .</error>");
exit(1);
break;
}
Worker::runAll();
}
/**
* 启动register
* @access public
* @param string $registerAddress
* @return void
*/
public function register($registerAddress)
{
// 初始化register
new Register('text://' . $registerAddress);
}
/**
* 启动businessWorker
* @access public
* @param string $registerAddress registerAddress
* @param array $option 参数
* @return void
*/
public function businessWorker($registerAddress, $option = [])
{
// 初始化 bussinessWorker 进程
$worker = new BusinessWorker();
$this->option($worker, $option);
$worker->registerAddress = $registerAddress;
}
/**
* 启动gateway
* @access public
* @param string $registerAddress registerAddress
* @param string $host 服务地址
* @param integer $port 监听端口
* @param array $option 参数
* @return void
*/
public function gateway($registerAddress, $host, $port, $option = [])
{
// 初始化 gateway 进程
if (!empty($option['socket'])) {
$socket = $option['socket'];
unset($option['socket']);
} else {
$protocol = !empty($option['protocol']) ? $option['protocol'] : 'websocket';
$socket = $protocol . '://' . $host . ':' . $port;
unset($option['host'], $option['port'], $option['protocol']);
}
$gateway = new Gateway($socket, isset($option['context']) ? $option['context'] : []);
// 以下设置参数都可以在配置文件中重新定义覆盖
$gateway->name = 'Gateway';
$gateway->count = 4;
$gateway->lanIp = '127.0.0.1';
$gateway->startPort = 2000;
$gateway->pingInterval = 30;
$gateway->pingNotResponseLimit = 0;
$gateway->pingData = '{"type":"ping"}';
$gateway->registerAddress = $registerAddress;
// 全局静态属性设置
foreach ($option as $name => $val) {
if (in_array($name, ['stdoutFile', 'daemonize', 'pidFile', 'logFile'])) {
Worker::${$name} = $val;
unset($option[$name]);
}
}
$this->option($gateway, $option);
}
/**
* 设置参数
* @access protected
* @param Worker $worker Worker对象
* @param array $option 参数
* @return void
*/
protected function option($worker, array $option = [])
{
// 设置参数
if (!empty($option)) {
foreach ($option as $key => $val) {
$worker->$key = $val;
}
}
}
}
然后修改config/console.php文件,添加workman命令
return [
// 指令定义
'commands' => [
'workerman' => 'app\command\Workerman',
],
];
然后通过命令行启动gateway。
php think workerman register
php think workerman businessworker
php think workerman gateway
对应Workman.php设置的命令参数,如果需要重新命名,注意对应关系。
进阶1
每次都启动三个命令框,有点麻烦,所以调整了下,写了三个bat文件
register.bat
@echo off
php E:\WWW\tp6\think workerman register
business.bat
@echo off
php E:\WWW\tp6\think workerman businessworker
gateway.bat
@echo off
php E:\WWW\tp6\think workerman gateway
又写了一个all.bat
@echo off
start call E:\WWW\tp6\register.bat
start call E:\WWW\tp6\business.bat
start call E:\WWW\tp6\gateway.bat
这样一个bat就搞定了,但是每次都有3个弹窗也不好。
进阶2
于是又写了一个all.vbs
set ws=WScript.CreateObject("WScript.Shell")
ws.Run "E:\WWW\tp6\register.bat",0
ws.Run "E:\WWW\tp6\business.bat",0
ws.Run "E:\WWW\tp6\gateway.bat",0
这样就可以启动一个文件,而且没有弹窗。
当然还可以放在开机启动文件夹里面,这样就能随着开机自启动,目录如下(该路径为win7下路径,其他系统未知)
C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup