人的記憶力會(huì)隨著歲月的流逝而衰退,,寫(xiě)作可以彌補(bǔ)記憶的不足,,將曾經(jīng)的人生經(jīng)歷和感悟記錄下來(lái),也便于保存一份美好的回憶。那么我們?cè)撊绾螌?xiě)一篇較為完美的范文呢,?以下是我為大家搜集的優(yōu)質(zhì)范文,僅供參考,,一起來(lái)看看吧
如何使用php構(gòu)建一個(gè)高性能的彈幕后端服務(wù)框架 彈幕網(wǎng)站源碼篇一
現(xiàn)在很多網(wǎng)站都流行使用“彈幕”這種形式來(lái)實(shí)現(xiàn)互動(dòng),。看到現(xiàn)在各種網(wǎng)站都有酷炫的彈幕飛過(guò),,我們是不是也想給自己的網(wǎng)站加入彈幕功能呢,?如何使用php構(gòu)建一個(gè)高性能的彈幕后端服務(wù)呢?下面小編為大家解答一下,,希望能幫到您,!
首先彈幕的后端其實(shí)說(shuō)白了和公共聊天室的后端原理十分相似,都是一個(gè)客戶端發(fā)送消息給服務(wù)端,,服務(wù)端再將收到的消息廣播給其他的客戶端,。對(duì)于后端來(lái)說(shuō)他們幾乎沒(méi)區(qū)別,區(qū)別就在于前端,。
好在我們有一個(gè)前端彈幕插件,,這個(gè)插件是一個(gè)jquery插件,github地址:https:///chiruom/,,基本上會(huì)使用jquery語(yǔ)法,,看看示例代碼就可以傻瓜化使用。
前端已經(jīng)有了解決方案,,但是后端呢,?前端如何與后端通訊?用傳統(tǒng)的ajax輪詢嗎,?不行,,這樣效率太低,想想各大火爆的直播平臺(tái)都是同一時(shí)間幾萬(wàn)人在線,,幾千人同時(shí)發(fā)彈幕,,如果靠ajax輪詢一個(gè)php接口的話服務(wù)器會(huì)吃不消的。且彈幕消息存儲(chǔ)方案略顯復(fù)雜,,有人問(wèn)為什么要存儲(chǔ)呢,?因?yàn)閍jax使用的http協(xié)議是無(wú)狀態(tài)協(xié)議,,a客戶端和b客戶端之間對(duì)于服務(wù)器來(lái)說(shuō)沒(méi)有任何標(biāo)志,如果服務(wù)器要確保a客戶端和b客戶端分別在兩次請(qǐng)求的時(shí)候服務(wù)器只返回這兩個(gè)客戶端沒(méi)有獲取過(guò)的彈幕消息,,那么服務(wù)器端就必須使用一個(gè)緩存來(lái)標(biāo)識(shí)某某客戶端看過(guò)哪條彈幕消息,。綜上所述ajax可以實(shí)現(xiàn)小規(guī)模的彈幕通信方案,但是很麻煩,。
好在最新的html5中加入了websocket協(xié)議,,我們可以通過(guò)websocket這種基于http協(xié)議之上的即時(shí)通信協(xié)議來(lái)替代ajax這種傳統(tǒng)的我問(wèn)你答的老舊通信模式。而我們是phper,,對(duì)于我們這種只懂php的人該如何編寫(xiě)websocket服務(wù)端呢,?好在我們又得知php有一個(gè)swoole擴(kuò)展,我們?cè)趐hp語(yǔ)言中使用它可以很方便的構(gòu)建一個(gè)websocket服務(wù)端,。
關(guān)于swoole的介紹可以參照他的官網(wǎng)http:///,,下面引用官網(wǎng)對(duì)它的一段簡(jiǎn)短的介紹。
php的異步,、并行,、高性能網(wǎng)絡(luò)通信引擎,使用純c語(yǔ)言編寫(xiě),,提供了php語(yǔ)言的異步多線程服務(wù)器,,異步tcp/udp網(wǎng)絡(luò)客戶端,異步mysql,,異步redis,,數(shù)據(jù)庫(kù)連接池,asynctask,,消息隊(duì)列,,毫秒定時(shí)器,異步文件讀寫(xiě),,異步dns查詢,。 swoole內(nèi)置了http/websocket服務(wù)器端/客戶端、http2.0服務(wù)器端,。
swoole可以廣泛應(yīng)用于互聯(lián)網(wǎng),、移動(dòng)通信、企業(yè)軟件,、云計(jì)算,、網(wǎng)絡(luò)游戲、物聯(lián)網(wǎng)(iot),、車(chē)聯(lián)網(wǎng),、智能家居等領(lǐng)域。 使用php+swoole作為網(wǎng)絡(luò)通信框架,,可以使企業(yè)it研發(fā)團(tuán)隊(duì)的效率大大提升,,更加專(zhuān)注于開(kāi)發(fā)創(chuàng)新產(chǎn)品,。
先別被swoole這么多的功能?chē)樀搅恕N覀兿汝P(guān)注這里面的重點(diǎn)
swoole內(nèi)置了http/websocket服務(wù)器端/客戶端
意味著我們可以通過(guò)它構(gòu)建websocket的服務(wù)端,。看到這里我們是不是就急急忙忙去拿官網(wǎng)的websocket服務(wù)端代碼做測(cè)試呢,?不,,swoole是一個(gè)php擴(kuò)展,意味著我們還得去安裝它,。中加入extension=就可以了呢,?還不是,我們先去看看swoole擴(kuò)展的依賴,,這也是我們使用任何語(yǔ)言的任何外部包,,外部模塊,外部擴(kuò)展最先要了解的問(wèn)題,。
參考官網(wǎng):http:///wiki/page/
環(huán)境依賴
僅支持linux,,freebsd,macos,,3類(lèi)操作系統(tǒng)
linux內(nèi)核版本2.3.32以上
php5.3.10以上版本,,包括php7
gcc4.4以上版本或者clang
cmake2.4+,編譯為lib作為c/c++庫(kù)時(shí)需要使用cmake
php版本依賴
swoole僅支持php5.3.10或更高版本,,建議使用php5.4+
swoole不依賴php的stream,、sockets、pcntl,、posix,、sysvmsg等擴(kuò)展。php只需安裝最基本的擴(kuò)展即可
意味著我們windows下是無(wú)法使用這個(gè)擴(kuò)展了(其實(shí)可以借助cygwin在win下使用swoole,,但是考慮到我們使用swoole擴(kuò)展就是為了性能,,也為了熟悉以后的生產(chǎn)環(huán)節(jié)部署做準(zhǔn)備,強(qiáng)烈推薦在linux下開(kāi)發(fā)),,那么我們把開(kāi)發(fā)環(huán)境轉(zhuǎn)移到linux下進(jìn)行吧,。
接著還要求linux內(nèi)核版本為2.3.32以上,php為5.3.10以上,,那么我們就用最新的centos吧,,這個(gè)版本的yum安裝的php直接就是php7最新版,根本無(wú)需考慮其他問(wèn)題,,當(dāng)然你喜歡圖形界面,,用ubuntu也可以。其他的基本上最新的linux發(fā)行版都是符合版本要求的,。
接著我們便來(lái)安裝這個(gè)擴(kuò)展,,推薦使用pecl來(lái)安裝,,只需要一條
pecl install swoole
即可,非常方便,。當(dāng)然你要編譯安裝,,具體步驟請(qǐng)參考http:///wiki/page/
安裝完擴(kuò)展之后在命令行下輸入
php -m
檢查,如果有swoole那么說(shuō)明安裝成功了,。
接下來(lái)就正式開(kāi)始我們的編碼旅程了,。
開(kāi)始編碼旅程之前我們先看看最基礎(chǔ)的效果原型是什么樣子
沒(méi)錯(cuò)就是這個(gè)樣子,兩個(gè)瀏覽器之前完全獨(dú)立使用websocket連接服務(wù)端,,因此對(duì)于服務(wù)端來(lái)說(shuō)這兩個(gè)瀏覽器就相當(dāng)于兩個(gè)完全處在不同機(jī)器上的客戶端,。
效果看完了就開(kāi)始來(lái)講代碼吧。
我們先看看官網(wǎng)的websocket服務(wù)端示例代碼,。
$serv = new swoolewebsocketserver("127.0.0.1", 9502);
$serv->on('open', function($server, $req) {
echo "connection open: ".$req->fd;
});
$serv->on('message', function($server, $frame) {
echo "message: ".$frame->data;
$server->push($frame->fd, json_encode(["hello", "world"]));
});
$serv->on('close', function($server, $fd) {
echo "connection close: ".$fd;
});
$serv->start();
我們看到這個(gè)代碼的第一行先是new了一個(gè)websocket服務(wù)端對(duì)象,,并且在構(gòu)造方法中的第一個(gè)參數(shù)指定了服務(wù)端監(jiān)聽(tīng)的ip,第二個(gè)參數(shù)指定了服務(wù)端監(jiān)聽(tīng)的端口,。然后使用on方法為每一個(gè)事件設(shè)置了回調(diào)函數(shù),,最后一行start方法正式開(kāi)始運(yùn)行服務(wù)端。
這種寫(xiě)法非常像javascript里面的異步調(diào)用,,這也是swoole中的事件驅(qū)動(dòng)異步非阻塞特性,,正因?yàn)槭沁@種特性,每一個(gè)獨(dú)立的事件(請(qǐng)求)會(huì)在服務(wù)端接收到之后分別異步處理,,他們之間無(wú)需互相等待,,這也是swoole性能高的原因所在。