首先Socket這個(gè)方案都很多種抚垄,webSocket也是其中的一種通信方案。在以前的PHP總谋逻,做這一項(xiàng)的事情是非常痛苦呆馁。雖然現(xiàn)在有了好多選擇,比如Swoole還有Workerman等毁兆,可是一堆回調(diào)你能忍浙滤?由于Socket很多PHP框架都不太成熟,可是websocket這個(gè)協(xié)議到時(shí)幫了php不少問題气堕。
我現(xiàn)在屬于的團(tuán)隊(duì)前后端各站一半纺腊,在技術(shù)選型上也糾結(jié)了一點(diǎn)時(shí)間。我到底是選擇Socket.io的php版本還是直接Socket.io的node.js版本茎芭。
指導(dǎo)Omi的作者說出了揖膜,騰訊文檔是用 Socket.io這話,我突然回想起梅桩,網(wǎng)易云音樂壹粟、金十?dāng)?shù)據(jù)、imgur等運(yùn)營(yíng)的技術(shù)都是Socket.io宿百,至于為什么這樣趁仙,PHP做什么事情最擅長(zhǎng)?答案無疑:WEB開發(fā)垦页,創(chuàng)業(yè)公司的急救包雀费。
讓很多企業(yè)前期可以實(shí)現(xiàn)大吉大利,年終吃雞的美夢(mèng)外臂。那么web的數(shù)據(jù)傳輸過程中坐儿,json是標(biāo)配,那么是處理json最拿手宋光?無疑是JavaScript貌矿。所以node.js的Socket.io無疑是最好的選擇。
圖中網(wǎng)易云使用的0.9.16的版本罪佳,已經(jīng)能運(yùn)行這么多年了逛漫,可見性能強(qiáng)悍,而且有成熟的分布式組件方案赘艳,可以橫向擴(kuò)展酌毡,性能不是瓶頸問題克握。
我先聊聊,項(xiàng)目業(yè)務(wù)之間是如何處理枷踏。
這是最簡(jiǎn)單和最理想的一種情況菩暗。
但是我們后端代碼是php,api數(shù)據(jù)接口層也是php旭蠕。用的是laravel停团。laravel和socket.io是兩個(gè)程序,而且現(xiàn)在的php的websocket客戶端只要Swoole享用掏熬。
那么我們要怎么處理呢佑稠??這里我們需要用到是laravel的異步消息隊(duì)列和爬蟲原理旗芬。
這時(shí)候我們PHP這邊的處理方式是以下方式舌胶。
我們會(huì)在php制作一個(gè)頁(yè)面來做渲染,在異步隊(duì)列用把消息通過爬蟲的原理把ws激活疮丛。頁(yè)面內(nèi)容如下幔嫂。
<!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>
為什么做異步,而不是同步呢这刷?因?yàn)楫惒脚艿檬橇硪粭l線程婉烟,用戶可以做其他事情,別人收到消息暇屋,回你做說吧似袁,你平時(shí)和別人聊天的時(shí)候,也不會(huì)一直靜靜看著聊天框吧咐刨?