Swoole\Table共享内存实现多进程数据共享

作者: 温新

分类: 【高性能PHP】

阅读: 2451

时间: 2021-04-22 16:40:45

由于 PHP 语言不支持多线程,因此 Swoole 使用多进程模式,在多进程模式下存在进程内存隔离,在工作进程内修改 global 全局变量和超全局变量时,在其他进程是无效的。

Swoole中实现多进程间数据共享有三种方法实现:

  • 数据库,如:MySQLMongoDB
  • 缓存服务器,如:RedisMemcache
  • 磁盘文件,多进程并发读写时需要加锁

虽然有这三种方法实现,但会带来新的问题。如多进程同时操作一个文件,以数据库为列,多个进程同时操作一条数据,这样会导致最终结果与所预期的不一致,此时可以通过锁来解决。

Swoole\Table是一个基于共享内存和锁实现的高性能并发数据结构,可用于解决多进程/多线程数据共享和同步加锁问题,有如下优势:

  • 性能强悍,单线程每秒可读写 200 万次;
  • 应用代码无需加锁,Table 内置行锁自旋锁,所有操作均是多线程 / 多进程安全。用户层完全不需要考虑数据同步问题;
  • 支持多进程,Table 可以用于多进程之间共享数据;
  • 使用行锁,而不是全局锁,仅当 2 个进程在同一 CPU 时间,并发读取同一条数据才会进行发生抢锁。

通过Swoole\Table实现小案例

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(152, 26, 26)"><?</span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">php</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 初始化一个内存容量为1024的内存表</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span> <span style="box-sizing: border-box;color: rgb(152, 26, 26)">=</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">new</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">\Swoole\Table</span>(<span style="box-sizing: border-box;color: rgb(17, 102, 68)">1024</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 内存表中新增 id 列</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">column</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'id'</span>,<span style="box-sizing: border-box;color: rgb(0, 0, 0)">\Swoole\Table</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">TYPE_INT</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 内存表中新增 name 列</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">column</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'name'</span>, <span style="box-sizing: border-box;color: rgb(0, 0, 0)">\Swoole\Table</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">TYPE_STRING</span>, <span style="box-sizing: border-box;color: rgb(17, 102, 68)">10</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 内存表中新增中 score 列</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">column</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'score'</span>, <span style="box-sizing: border-box;color: rgb(0, 0, 0)">\Swoole\Table</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">TYPE_FLOAT</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 创建内存表</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">create</span>();</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 设置数据</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">set</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'stu-1'</span>,[<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'id'</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">1</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'name'</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span><span style="box-sizing: border-box;color: rgb(170, 17, 17)">'lisi'</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'score'</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">60</span>]);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">set</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'stu-2'</span>,[<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'id'</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">2</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'name'</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span><span style="box-sizing: border-box;color: rgb(170, 17, 17)">'wangwu'</span>,<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'score'</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">90</span> ]);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 若key存在则打印其值</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">if</span> (<span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">exist</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'stu-1'</span>)) {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(119, 0, 136)">echo</span> <span style="box-sizing: border-box;color: rgb(170, 17, 17)">"stu-"</span> . <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'stu-1'</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'id'</span>) . <span style="box-sizing: border-box;color: rgb(170, 17, 17)">':'</span> . <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'stu-1'</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'name'</span>).<span style="box-sizing: border-box;color: rgb(170, 17, 17)">":"</span>.</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">get</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'stu-1'</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'score'</span>) . <span style="box-sizing: border-box;color: rgb(170, 17, 17)">"\n"</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 自增</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">incr</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'stu-2'</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'score'</span>, <span style="box-sizing: border-box;color: rgb(17, 102, 68)">5</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 自减</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">decr</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'stu-2'</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'score'</span>, <span style="box-sizing: border-box;color: rgb(17, 102, 68)">5</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 获取表中总数量</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$count</span> <span style="box-sizing: border-box;color: rgb(152, 26, 26)">=</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(51, 0, 170)">count</span>();</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 删除指定表</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">$table</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">del</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'stu-1'</span>);</span>

Laravel8中使用Swoole\Table

如何在Laravel8中实现Swoole\Table,这里还是基于先前安装的LaravelS作为案例。

本篇文章基于 WebSocket实现,沿用之前的代码。若还没有配置WebSocket请参考 Laravel8使用laravel-s实现WebSocket服务器

第一步:配置laravels.php

文件位置:config/laravels.php配置swoole_tables(该配置默认为空数组)

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 17, 17)">'swoole_tables'</span> <span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span> [</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// ws为表名前缀,完整表为wsTable</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'ws'</span>    <span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span>  [</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 表容量</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'size'</span>  <span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span>  <span style="box-sizing: border-box;color: rgb(17, 102, 68)">102400</span>,</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 表字段,字段名为value</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'column'</span>    <span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span>  [</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">            [<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'name'</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span><span style="box-sizing: border-box;color: rgb(170, 17, 17)">'value'</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'type'</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">\Swoole\Table</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">TYPE_INT</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'size'</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">8</span>]</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        ]</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    ]</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 可以配置多个表</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">],</span>

第二步:修改WebSocketService.php

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

只修改 onOpen与onMessage方法,没有变动的使用省略号替代

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(152, 26, 26)"><?</span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">php</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">   </span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)">// *** 省略命名空间</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    </span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">class</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">WebSocketService</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">implements</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">WebSocketHandlerInterface</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">{</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">  <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// *** </span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">   </span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(119, 0, 136)">public</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">onOpen</span>(<span style="box-sizing: border-box;color: rgb(0, 0, 0)">Server</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$server</span>, <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Request</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$request</span>)</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">   {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Log</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">info</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'WebSocket 建立连接'</span> . <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$request</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">fd</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 设置表中的数据</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(0, 0, 0)">app</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'swoole'</span>)<span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">wsTable</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">set</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'fd:'</span> . <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$request</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">fd</span>, [<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'value'</span> <span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$request</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">fd</span>]);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 发送给客户端的数据</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$server</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">push</span>(<span style="box-sizing: border-box;color: rgb(0, 85, 170)">$request</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">fd</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'Welcome to LaravelS,I am WebSocket'</span>);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">   }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    </span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">   <span style="box-sizing: border-box;color: rgb(119, 0, 136)">public</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">function</span> <span style="box-sizing: border-box;color: rgb(0, 0, 255)">onMessage</span>(<span style="box-sizing: border-box;color: rgb(0, 0, 0)">Server</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$server</span>, <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Frame</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$frame</span>)</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">   {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">       <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 遍历表中的数据</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        <span style="box-sizing: border-box;color: rgb(119, 0, 136)">foreach</span> (<span style="box-sizing: border-box;color: rgb(0, 0, 0)">app</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'swoole'</span>)<span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">wsTable</span> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">as</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$key</span> <span style="box-sizing: border-box;color: rgb(152, 26, 26)">=></span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$row</span>) {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">            <span style="box-sizing: border-box;color: rgb(119, 0, 136)">if</span> (<span style="box-sizing: border-box;color: rgb(51, 0, 170)">strpos</span>(<span style="box-sizing: border-box;color: rgb(0, 85, 170)">$key</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'fd:'</span>) <span style="box-sizing: border-box;color: rgb(152, 26, 26)">===</span> <span style="box-sizing: border-box;color: rgb(17, 102, 68)">0</span> <span style="box-sizing: border-box;color: rgb(152, 26, 26)">&&</span> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$server</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">exist</span>(<span style="box-sizing: border-box;color: rgb(0, 85, 170)">$row</span>[<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'value'</span>])) {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">                <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Log</span>::<span style="box-sizing: border-box;color: rgb(0, 0, 0)">info</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'Receive message from client: '</span> . <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$row</span>[<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'value'</span>]);</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">                <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// 调用 push 方法向客户端推送数据</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">                <span style="box-sizing: border-box;color: rgb(0, 85, 170)">$server</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">push</span>(<span style="box-sizing: border-box;color: rgb(0, 85, 170)">$frame</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-></span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">fd</span>, <span style="box-sizing: border-box;color: rgb(170, 17, 17)">'This is a message sent from WebSocket Server at '</span> . <span style="box-sizing: border-box;color: rgb(51, 0, 170)">date</span>(<span style="box-sizing: border-box;color: rgb(170, 17, 17)">'Y-m-d H:i:s'</span>));</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">            }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">        }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">   }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    </span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">  <span style="box-sizing: border-box;color: rgb(170, 85, 0)">// ***</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span>

第三步:运行html文件

我这里将html文件放在了windows上

第四步:查看laravel日志文件

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 0, 0)">tail</span> <span style="box-sizing: border-box;color: rgb(152, 26, 26)">-</span><span style="box-sizing: border-box;color: rgb(0, 0, 0)">f</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">laravel</span>.<span style="box-sizing: border-box;color: rgb(0, 0, 0)">log</span> </span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">    </span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">[<span style="box-sizing: border-box;color: rgb(17, 102, 68)">2021</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-</span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">04</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-</span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">22</span> <span style="box-sizing: border-box;color: rgb(17, 102, 68)">16</span>:<span style="box-sizing: border-box;color: rgb(17, 102, 68)">36</span>:<span style="box-sizing: border-box;color: rgb(17, 102, 68)">29</span>] <span style="box-sizing: border-box;color: rgb(0, 0, 0)">local</span>.<span style="box-sizing: border-box;color: rgb(0, 0, 0)">INFO</span>: <span style="box-sizing: border-box;color: rgb(0, 0, 0)">WebSocket</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">建立连接1</span>  </span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">[<span style="box-sizing: border-box;color: rgb(17, 102, 68)">2021</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-</span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">04</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-</span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">22</span> <span style="box-sizing: border-box;color: rgb(17, 102, 68)">16</span>:<span style="box-sizing: border-box;color: rgb(17, 102, 68)">36</span>:<span style="box-sizing: border-box;color: rgb(17, 102, 68)">33</span>] <span style="box-sizing: border-box;color: rgb(0, 0, 0)">local</span>.<span style="box-sizing: border-box;color: rgb(0, 0, 0)">INFO</span>: <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Receive</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">message</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">from</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">client</span>: <span style="box-sizing: border-box;color: rgb(17, 102, 68)">1</span>  </span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">[<span style="box-sizing: border-box;color: rgb(17, 102, 68)">2021</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-</span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">04</span><span style="box-sizing: border-box;color: rgb(152, 26, 26)">-</span><span style="box-sizing: border-box;color: rgb(17, 102, 68)">22</span> <span style="box-sizing: border-box;color: rgb(17, 102, 68)">16</span>:<span style="box-sizing: border-box;color: rgb(17, 102, 68)">36</span>:<span style="box-sizing: border-box;color: rgb(17, 102, 68)">41</span>] <span style="box-sizing: border-box;color: rgb(0, 0, 0)">local</span>.<span style="box-sizing: border-box;color: rgb(0, 0, 0)">INFO</span>: <span style="box-sizing: border-box;color: rgb(0, 0, 0)">Receive</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">message</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">from</span> <span style="box-sizing: border-box;color: rgb(0, 0, 0)">client</span>: <span style="box-sizing: border-box;color: rgb(17, 102, 68)">1</span> </span>

如果看到日志信息,那么此案例就完成了。

请登录后再评论