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