thinkphp5整合workerman,tp5整合workerman,使用原汁原味的workerman

0

由于workerman底层直接读取$_SERVER['argv']的命令行参数,没有提供独立的方法start/stop,而tp的命令行参数无法适配workerman,虽然thinkphp官方专门做了一个适配的版本,但是看了下评论问题挺多的。于是自己来搞一个.


(1).在application/command.php中添加如下代码:


return [
'app\socket\command\Socket'
];

(2).创建 application/socket/command目录,在这个目录创建Socket.php文件


<?php
namespace app\socket\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use Workerman\Worker;

class Socket extends Command
{
/**
* 命令Input配置
*/
protected function configure()
{
$this->setName('socket')
->addArgument('action', Argument::OPTIONAL, "action")
->addOption('other', '-d', Option::VALUE_OPTIONAL, 'test');
}

/**
* 重置Cli参数
*/
protected function resetCli()
{
global $argv, $argc;

$file = "{$argv['0']} {$argv['1']}";
$action = $argv['2'];
$extend = empty($argv['3']) ? '' : $argv['3'];
$argv = [];
$argv[] = $file;
$argv[] = $action;
if ($extend)
{
$argv[] = $extend;
}
$argc = count($argv);

$_SERVER['argv'] = $argv;
$_SERVER['argc'] = $argc;
}

/**
* 命令响应
* @param Input $input
* @param Output $output
* @return int|void|null
*/
protected function execute(Input $input, Output $output)
{
//01.重置Cli命令行参数
$this->resetCli();

//02.开始WorkMan代码
$ws_worker = new Worker(config('socket.socket_name'));

// 启动4个进程对外提供服务
$ws_worker->count = 2;

// 接收到浏览器发送的数据时回复hello world给浏览器
$ws_worker->onMessage = function ($connection, $data) {

// 向浏览器发送hello world
$connection->send('hello ' . $data);

};

// 运行worker
Worker::runAll();
}
}

(3).在tp根目录执行命令
php think socket start


名字不想叫socket,可以修改$this->setName('socket')


linux和windows全部支持。甚至兼容了workerman的提示命令都是提示正确的


start后输出:
Workerman[think socket] start in DEBUG mode
------------------------------------------- WORKERMAN --------------------------------------------
Workerman version:4.0.3 PHP version:7.3.5
-------------------------------------------- WORKERS ---------------------------------------------
proto user worker listen processes status

tcp root none websocket://0.0.0.0:2000 2 [OK]


Press Ctrl+C to stop. Start success.
start -d 输出:
Workerman[think socket] start in DAEMON mode
------------------------------------------- WORKERMAN --------------------------------------------
Workerman version:4.0.3 PHP version:7.3.5
-------------------------------------------- WORKERS ---------------------------------------------
proto user worker listen processes status

tcp root none websocket://0.0.0.0:2000 2 [OK]


Input "php think socket stop" to stop. Start success.


stop输出:
Workerman[think socket] stop
Workerman[think socket] is stopping ...
Workerman[think socket] stop success


完美

已邀请:

a392223903 - 我是高久峰

赞同来自:

目前仅仅windows测试通过

a392223903 - 我是高久峰

赞同来自:

目前linux测试通过

要回复问题请先登录注册