首先Socket这个方案都很多种,webSocket也是其中的一种通信方案。在以前的PHP总,做这一项的事情是非常痛苦。虽然现在有了好多选择,比如Swoole还有Workerman等,可是一堆回调你能忍?由于Socket很多PHP框架都不太成熟,可是websocket这个协议到时帮了php不少问题。
我现在属于的团队前后端各站一半,在技术选型上也纠结了一点时间。我到底是选择Socket.io的php版本还是直接Socket.io的node.js版本。
指导Omi的作者说出了,腾讯文档是用 Socket.io这话,我突然回想起,网易云音乐、金十数据、imgur等运营的技术都是Socket.io,至于为什么这样,PHP做什么事情最擅长?答案无疑:WEB开发,创业公司的急救包。
让很多企业前期可以实现大吉大利,年终吃鸡的美梦。那么web的数据传输过程中,json是标配,那么是处理json最拿手?无疑是JavaScript。所以node.js的Socket.io无疑是最好的选择。
图中网易云使用的0.9.16的版本,已经能运行这么多年了,可见性能强悍,而且有成熟的分布式组件方案,可以横向扩展,性能不是瓶颈问题。
我先聊聊,项目业务之间是如何处理。
这是最简单和最理想的一种情况。
但是我们后端代码是php,api数据接口层也是php。用的是laravel。laravel和socket.io是两个程序,而且现在的php的websocket客户端只要Swoole享用。
那么我们要怎么处理呢??这里我们需要用到是laravel的异步消息队列和爬虫原理。
这时候我们PHP这边的处理方式是以下方式。
我们会在php制作一个页面来做渲染,在异步队列用把消息通过爬虫的原理把ws激活。页面内容如下。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
</body>
</html>
<script src="{{asset('/static/lib/socket/socket.io.js')}}"></script>
<script>
var socket = io('{{env('WEB_SOCKET_URL')}}');
socket.emit('{{$event}}',{!! $data !!});
</script>
为什么做异步,而不是同步呢?因为异步跑得是另一条线程,用户可以做其他事情,别人收到消息,回你做说吧,你平时和别人聊天的时候,也不会一直静静看着聊天框吧?