我们提供安全,免费的手游软件下载!
大家好,我是码农先森。
在早些年前,客户端想要实时获取最新消息,通常使用定时长轮询的方式,不断从服务器上获取数据。然而,这种粗暴的操作方式实属不雅。尽管如今很少见到这种方式的应用,但在一些场景下仍有人使用,比如在PC端扫描二维码,然后使用长轮询的方式从服务端获取最新的扫码信息,来判断用户是否已经完成扫码。为什么还有人使用长轮询的方式呢?
我认为最直接的原因是“开发起来简单明了”。人性决定了人类都是趋易避难的高级物种,那个容易上手就用那个。不过,除了长轮询的方式外,WebSocket技术其实也不难。只不过对于从来没有接触过长连接的人来说,刚开始上手时会有一些思维上的障碍。本次分享的内容是基于WebSocket技术的消息推送中心。看起来很高大上,其实也就是通过一些小的例子来演示,从服务端推送数据到客户端的这个过程。接下来的例子简单明了,容易上手。我们赶紧开始吧。
话不多说,开整!我们先来看一下整体的项目目录结构,内容主要分为PHP和Go两部分。
...
使用composer创建基于ThinkPHP框架的php_websocket项目。
...
使用
php think make:controller Worker
命令创建
Worker.php
控制器。这个控制器中主要实现了
onWorkerStart
这个方法,首先添加了一个Timer异步定时器,然后从Redis队列中读取消息,最后将消息推送到客户端。这个定时器会每间隔一秒钟调度一次。
...
使用
php think make:controller Push
命令创建
Push.php
控制器。这个控制器的主要作用是接收外部的消息内容,然后推送到Redis消息队列中。这里提供的是API接口,这个接口可以在外部的后台系统调用。
...
先运行
php think worker
启动HTTP服务,再运行
php think worker:server
启动WebSocket服务,最后来测试一波。
...
通过这两个简单的例子,我相信大家已经对WebSocket技术有所了解。从例子中也可以看出来,其实在PHP和Go中实现上有所区别。PHP中需要启动两个服务,一个是HTTP服务,一个是WebSocket服务,而且两者服务直接都是单独的进程,不能相互通信,需要额外借助第三方中间件Redis来实现数据的传输。反观Go中直接一个服务涵盖了HTTP服务和WebSocket服务,共享一个进程的数据资源,通过使用Channel通道传递消息。
...
此外,在PHP中需要使用Timer异步定时器来读取Redis消息队列中的数据,不能用for循环或者Redis的阻塞队列,因为它会阻塞整个进程的执行。而在Go中直接开启一个协程,在协程中等待通道中的消息即可,会一直阻塞到消息的到来,而且它不会阻塞整个进程的执行,由此可见在这个例子中Go相较于PHP的优势显著。最后可能有些从来没有使用过WebSocket技术的朋友,可能看完这篇文章之后也依然会云里雾里,所以建议这些朋友可以自己亲自实践一下文中的案例,实践过后我相信你会别有一番技术体验。如果有想要获取完整案例代码的朋友,可以在公众号内回复「2463」即可,希望对大家能有所帮助。
感谢大家阅读,个人观点仅供参考,欢迎在评论区发表不同观点。
欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。
热门资讯