Laravel8使用laravel-s实现WebSocket服务器

作者: 温新

分类: 【高性能PHP】

阅读: 8403

时间: 2021-03-10 16:57:33

通过 详解基于Laravel8下的LaravelS实现高性能HTTP服务器 我们安装了LaravelS并实现了一个HTTP服务器,那么本篇文章在此基础上在实现一个Websocket服务器。

创建WebSocketService类

创建WebSocketService类并实现Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface类。

文件位置:app/Services/WebSocketService.php

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important"><?</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">php</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    </span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">namespace</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">App\Services</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">use</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Hhxsv5\LaravelS\Swoole\WebSocketHandlerInterface</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">use</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Swoole\Http\Request</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">use</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Swoole\Http\Response</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">use</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Swoole\WebSocket\Frame</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">use</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Swoole\WebSocket\Server</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">use</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Illuminate\Support\Facades\Log</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">/**</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">* @see https://wiki.swoole.com/#/start/start_ws_server</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">*/</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">class</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">WebSocketService</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">implements</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">WebSocketHandlerInterface</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">{</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 声明没有参数的构造函数</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">public</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">__construct</span>()</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    </span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">public</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">onOpen</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Server</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$server</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Request</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span>)</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 在触发onOpen事件之前,建立WebSocket的HTTP请求已经经过了Laravel的路由,</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 所以Laravel的Request、Auth等信息是可读的,Session是可读写的,但仅限在onOpen事件中。</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// \Log::info('New WebSocket connection', [$request->fd, request()->all(), session()->getId(), session('xxx'), session(['yyy' => time()])]);</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 此处抛出的异常会被上层捕获并记录到Swoole日志,开发者需要手动try/catch</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Log</span>::<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">info</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'WebSocket 建立连接'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$server</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">push</span>(<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$request</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">fd</span>, <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'Welcome to LaravelS'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">public</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">onMessage</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Server</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$server</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Frame</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$frame</span>)</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// \Log::info('Received message', [$frame->fd, $frame->data, $frame->opcode, $frame->finish]);</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 此处抛出的异常会被上层捕获并记录到Swoole日志,开发者需要手动try/catch</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$server</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">push</span>(<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$frame</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">-></span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">fd</span>, <span style="box-sizing: border-box;color: rgb(232, 191, 106) !important">date</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'Y-m-d H:i:s'</span>));</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">public</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">onClose</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Server</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$server</span>, <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$fd</span>, <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$reactorId</span>)</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">           <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Log</span>::<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">info</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'websocket 关闭'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">}</span>

修改配置文件

文件位置:app/config/laravels.php

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'websocket'</span>      <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> [</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'enable'</span>  <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">true</span>, <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 注意:设置enable为true</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'handler'</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">\App\Services\WebSocketService</span>::<span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">class</span>,</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">],</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'swoole'</span>         <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> [</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">//...</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// dispatch_mode只能设置为2、4、5,https://wiki.swoole.com/#/server/setting?id=dispatch_mode</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'dispatch_mode'</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=></span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">2</span>,</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">//...</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">],</span>

修改nginx配置文件

文件位置:/usr/local/nginx/conf/vhosts/laravel_s.conf

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">map</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$http_upgrade $connection_upgrade </span>{</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">default upgrade</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">''</span>      close;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">}</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">upstream</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">laravels </span>{</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 此处注意,我使用的是Linux系统环境,因此这里使用的是Linux中的IP地址</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 由于默认是127.0.0.1,或是在Linux中可能会导致websocket无法完成服务</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">server</span> 192.168.133.131:<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">5200 weight</span>=<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">5 max_fails</span>=<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">3 fail_timeout</span>=30s;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">keepalive 16</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">}</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">server</span> {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(128, 203, 196) !important">listen</span> 80;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(128, 203, 196) !important">server_name</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">laravel-s</span>.com;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(128, 203, 196) !important">root</span> /www/laravel_swoole/public;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">index</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">index</span>.<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">php index</span>.<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">html index</span>.htm;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">location</span> / {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(128, 203, 196) !important">try_files</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">$uri </span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">@laravels</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"> </span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 配置websockeet</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">location</span> = /<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">ws </span>{</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">proxy_http_version 1</span>.1;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">X-Real-IP</span> $remote_addr;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">X-Real-PORT</span> $remote_port;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">X-Forwarded-For</span> $proxy_add_x_forwarded_for;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Host </span>$http_host;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Scheme </span>$scheme;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Server-Protocol</span> $server_protocol;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Server-Name</span> $server_name;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Server-Addr</span> $server_addr;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Server-Port</span> $server_port;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Upgrade </span>$http_upgrade;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Connection </span>$connection_upgrade;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(128, 203, 196) !important">proxy_pass</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">http</span>://laravels;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 配置laravels</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">location</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">@laravels</span> {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">proxy_http_version 1</span>.1;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Connection </span><span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">""</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">X-Real-IP</span> $remote_addr;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">X-Real-PORT</span> $remote_port;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">X-Forwarded-For</span> $proxy_add_x_forwarded_for;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Host </span>$http_host;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Scheme </span>$scheme;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Server-Protocol</span> $server_protocol;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Server-Name</span> $server_name;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Server-Addr</span> $server_addr;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">proxy_set_header</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">Server-Port</span> $server_port;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(128, 203, 196) !important">proxy_pass</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">http</span>://laravels;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">}</span>

注意:laravels配置中的server需要填写本机IP。由于我使用的是Linux系统,因此配置了Linux系统中的IP。

配置.env文件

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">LARAVELS_LISTEN_IP</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">192.168</span>.<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">133.131</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">LARAVELS_DAEMONIZE</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">true</span></span>

LARAVELS_LISTEN_IP要与upstream laravels配置的IP一样

启动laravels

切换到应用根目录,启动laravels

<span style="color: rgb(255, 255, 255);">php bin/laravels start</span><br></br>

重启nginx服务器

<span style="color: rgb(255, 255, 255);">systemctl restart nginx.service</span><br></br>

编写前端界面

testSwoole.html,此界面位于windows

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span class="cm-tag cm-bracket" style="box-sizing: border-box"><</span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">html</span><span class="cm-tag cm-bracket" style="box-sizing: border-box">></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span class="cm-tag cm-bracket" style="box-sizing: border-box"><</span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">head</span><span class="cm-tag cm-bracket" style="box-sizing: border-box">></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"> <span class="cm-tag cm-bracket" style="box-sizing: border-box"><</span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">title</span><span class="cm-tag cm-bracket" style="box-sizing: border-box">></</span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">title</span><span class="cm-tag cm-bracket" style="box-sizing: border-box">></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span class="cm-tag cm-bracket" style="box-sizing: border-box"></</span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">head</span><span class="cm-tag cm-bracket" style="box-sizing: border-box">></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span class="cm-tag cm-bracket" style="box-sizing: border-box"><</span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">body</span><span class="cm-tag cm-bracket" style="box-sizing: border-box">></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"> <span class="cm-tag cm-bracket" style="box-sizing: border-box"><</span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">input</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">id</span>=<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">"input"</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">style</span>=<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">"width: 100%;"</span> <span class="cm-tag cm-bracket" style="box-sizing: border-box">></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"> <span class="cm-tag cm-bracket" style="box-sizing: border-box"><</span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">script</span><span class="cm-tag cm-bracket" style="box-sizing: border-box">></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">  <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">window</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">onload</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span>() {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">let</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">nick</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">prompt</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'Enter your nickname'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">let</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">input</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">document</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">getElementById</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'input'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">input</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">focus</span>();</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 初始化客户端套接字并建立连接</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">let</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">socket</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">new</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">WebSocket</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">"ws://laravel-s.com/ws"</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 建立连接时触发</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">socket</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">onopen</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span>(<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">event</span>) {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">     <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">console</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">log</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'连接开始...'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 接收到服务器信息</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">socket</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">onmessage</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span>(<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">event</span>) {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">let</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">msg</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">event</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">data</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">let</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">node</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">document</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">createTextNode</span>(<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">msg</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">let</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">div</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">document</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">createElement</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'div'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">div</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">appendChild</span>(<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">node</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">document</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">body</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">insertBefore</span>(<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">div</span>,<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">input</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">input</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">scrollIntoView</span>();</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 关闭连接时触发</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">socket</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">onclose</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span>(<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">event</span>) {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">console</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">log</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'连接关闭...'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">input</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">onchange</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span>() {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">let</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">msg</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">nick</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">+</span> <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">": "</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">+</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">input</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">value</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">socket</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">send</span>(<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">msg</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">input</span>.<span style="box-sizing: border-box;color: rgb(97, 175, 239) !important">value</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span><span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">""</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">   }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">  }</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"> <span class="cm-tag cm-bracket" style="box-sizing: border-box"></</span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">script</span><span class="cm-tag cm-bracket" style="box-sizing: border-box">></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span class="cm-tag cm-bracket" style="box-sizing: border-box"></</span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">body</span><span class="cm-tag cm-bracket" style="box-sizing: border-box">></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span class="cm-tag cm-bracket" style="box-sizing: border-box"></</span><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">html</span><span class="cm-tag cm-bracket" style="box-sizing: border-box">></span></span>

尤其注意 let socket = new WebSocket("ws://laravel-s.com/ws"); 此时已经变成域名,默认80端口。当访问此页面并输入信息后,客户端发起协议升级请求后将信息发送到指定地址

打开该html页面并输入信息后查看websocket通信请求过程,可以看到协议已经升级为websocket

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 通用头</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">General</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Request URL: ws://laravel-s.com/ws</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Request Method: GET</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Status Code: <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">101</span> Switching Protocols</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 响应头</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Connection: upgrade</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Date: Wed, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">10</span> Mar <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">2021</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">16</span>:39:21 GMT</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Sec-Websocket-Version: <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">13</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Upgrade: websocket</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important"># 通用头</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Sec-WebSocket-Key: <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">LeAIasPj2v1aK4TKw0QqsA</span><span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">==</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Sec-WebSocket-Version: <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">13</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">Upgrade: websocket</span>

关于报错

刚编写完成并运行时,websocket客户端(也就是浏览器运行的testSwoole.html)出现failed: Error during WebSocket handshake: Unexpected response code: 404错误,这个错误如何解决?都知道404为页面错误,根据这个我仔细检查了代码,没有错误,下面来说说我的解决方法吧, 虽然有些不知所以然。

解决方法

1)重启 laravels

2)重启nginx

我就是这样解决了这个错误,如何你也遇到同样的问题,欢迎一起交流学习。

请登录后再评论