ThinkPHP вот – вот выпустит последнюю версию 6.0. В ответ на растущую популярность Вулфа ThinkPHP также запустил новейшее расширение think – swool 3.0.
Предстоящий tp6.0 адаптировался к свулу. Он также представил think-swool 3.0 и по умолчанию адаптировал socketio. Версия 2.0 немного отличается с точки зрения использования.
Websocket наследуется от Http и нуждается в HTTP – запросе перед подключением к websocket. Если текущий адрес поддерживает websocket, он возвращает 101, а затем подключается. То есть, не после того, как мой сервис поддерживает websocket, запрос каждого адреса подключения может быть подключен с помощью websocket, но для подключения требуется предварительная адаптация.
Если для использования websocket необходимо включить в конфигурации, установите для параметра включить в разделе websocket значение true
'server' => [
'host'=>'0.0.0', //listening address
'port'=> 808, //listening port
'mode'=> SWOOLE_PROCESS, // Running mode defaults to SWOOLE_PROCESS
'sock_type'=> SWOOLE_SOCK_TCP, // sock type defaults to SWOOLE_SOCK_TCP
'options' => [
'pid_file' => runtime_path() . 'swoole.pid',
'log_file' => runtime_path() . 'swoole.log',
'daemonize' => false,
// Normally this value should be 1~4 times larger according to your cpu cores.
'reactor_num' => swoole_cpu_num(),
'worker_num' => swoole_cpu_num(),
'task_worker_num' => 4,//swoole_cpu_num(),
'enable_static_handler' => true,
'document_root' => root_path('public'),
'package_max_length' => 20 * 1024 * 1024,
'buffer_output_size' => 10 * 1024 * 1024,
'socket_buffer_size' => 128 * 1024 * 1024,
'max_request' => 3000,
'send_yield' => true,
],
],
'websocket' => [
'enabled'=> true, //Open websocket
'handler'=> Handler:: class, //custom wbesocket binding class
'parser'=> Parser:: class, // custom parsing class
'route_file' => base_path() . 'websocket.php',
'ping_interval' => 25000,
'ping_timeout' => 60000,
'room' => [
'type' => TableRoom::class,
'room_rows' => 4096,
'room_size' => 2048,
'client_rows' => 8192,
'client_size' => 2048,
],
],
'auto_reload' => true,
'enable_coroutine' => true,
'resetters' => [],
'tables' => [],Обработчик и анализатор значительно облегчают настройку служб веб-сокетов, системную интеграцию по умолчанию socketio.
В этой статье в основном рассказывается о том, как использовать socketio, при условии, что у вас есть определенное понимание и использование ввода-вывода сокета.
По умолчанию socket Io добавляет параметры к адресу запроса
В то же время socket io по умолчанию учитывает http://url/socket.io/to будьте адресом, который поддерживает службы websocket.
Запрос на адрес был обработан в рамках tp-swool 3.0
param('transport'), $this->transports)) {
return json(
[
'code' => 0,
'message' => 'Transport unknown',
],
400
);
}
if ($request->has('sid')) {
$response = response('1:6');
} else {
$sid = base64_encode(uniqid());
$payload = json_encode(
[
'sid' => $sid,
'upgrades' => ['websocket'],
'pingInterval' => $config->get('swoole.websocket.ping_interval'),
'pingTimeout' => $config->get('swoole.websocket.ping_timeout'),
]
);
$cookie->set('io', $sid);
$response = response('97:0' . $payload . '2:40');
}
return $response->contentType('text/plain');
}
public function reject(Request $request)
{
return json(
[
'code' => 3,
'message' => 'Bad request',
],
400
);
}
}
TP6.0, регистрация плагина использует режим обслуживания для регистрации. Информацию о регистрации маршрута можно просмотреть в файле регистрации службы tp-swool. Если вы хотите настроить правила связи, вы можете переопределить маршрутизацию.
[email protected]>
// +----------------------------------------------------------------------
namespace think\swoole;
use Swoole\Http\Server as HttpServer;
use Swoole\Websocket\Server as WebsocketServer;
use think\App;
use think\Route;
use think\swoole\command\Server as ServerCommand;
use think\swoole\facade\Server;
use think\swoole\websocket\socketio\Controller;
use think\swoole\websocket\socketio\Middleware;
class Service extends \think\Service
{
protected $isWebsocket = false;
/**
* @var HttpServer | WebsocketServer
*/
protected static $server;
public function register()
{
$this->isWebsocket = $this->app->config->get('swoole.websocket.enabled', false);
$this->app->bind(Server::class, function () {
if (is_null(static::$server)) {
$this->createSwooleServer();
}
return static::$server;
});
$this->app->bind('swoole.server', Server::class);
$this->app->bind(Swoole::class, function (App $app) {
return new Swoole($app);
});
$this->app->bind('swoole', Swoole::class);
}
public function boot(Route $route)
{
$this->commands(ServerCommand::class);
if ($this->isWebsocket) {
$route->group(function () use ($route) {
$route->get('socket.io/', '@upgrade');
$route->post('socket.io/', '@reject');
})->prefix(Controller::class)->middleware(Middleware::class);
}
}
/**
* Create swoole server.
*/
protected function createSwooleServer()
{
$server = $this->isWebsocket ? WebsocketServer::class : HttpServer::class;
$config = $this->app->config;
$host = $config->get('swoole.server.host');
$port = $config->get('swoole.server.port');
$socketType = $config->get('swoole.server.socket_type', SWOOLE_SOCK_TCP);
$mode = $config->get('swoole.server.mode', SWOOLE_PROCESS);
static::$server = new $server($host, $port, $mode, $socketType);
$options = $config->get('swoole.server.options');
static::$server->set($options);
}
}
По умолчанию для ввода-вывода сокета используется демо
Title
Способ Настройки Маршрутизации Websocket
Создайте новый веб-сайт. PHP-файл в каталоге приложений. Следует отметить, что из-за отражения имя параметра закрытия не может быть определено произвольно, иначе оно не может быть введено. Первый параметр-websocket, который является объектом сервера текущего websocket, а второй параметр, данные, – это данные, отправленные клиентом. Первый параметр socket io emit совпадает с первым параметром Websocket:: on в качестве имени события.
[email protected]
*/
use \think\swoole\facade\Websocket;
Websocket::on("test", function (\think\swoole\Websocket $websocket, $data) {
//var_dump($class);
$websocket->emit("test", "asd");
});
Websocket::on("test1", function ($websocket, $data) {
$websocket->emit("test", "asd");
});
Websocket::on("join", function (\think\swoole\Websocket $websocket, $data) {
$websocket->join("1");
});Обратитесь к приведенному выше методу, чтобы использовать новую службу websocket. Конечно, tp-swool 3.0 также имеет множество других новых функций, которые необходимо изучить и опробовать. Я также поделюсь с вами своим процессом использования в следующей статье.