Рубрики
Uncategorized

Учебник по использованию расширенного веб-сайта Thinkphp 6.0 swool (think-swool)

Автор оригинала: David Wong.

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 также имеет множество других новых функций, которые необходимо изучить и опробовать. Я также поделюсь с вами своим процессом использования в следующей статье.