利用websocket解決一些長時間等待場景

眾所周之,傳統(tǒng)的PHP(特指php-fpm)開發(fā)web應用很爽,但是涉及到長時間等待的場景就有點難受
痛點一
php-fpm的進程數(shù)是有限的尺铣,假設一個服務器實例開啟了40個php-fpm進程,一瞬間能處理的就是40個php請求,超過nginx很容易報502颗管。
假設每個請求都是100ms,理論值就是1s內(nèi)一個進程可以處理10個請求(一個進程處理完請求之后可以繼續(xù)處理其他請求)滓走,40個進程就可以處理400個請求(理論值)垦江。但假設一個請求處理需要1s甚至更長,意味著40個進程同1s只能處理40個請求,那么并發(fā)處理能力就直線下降比吭。所以響應時長對一個服務器的總體性能影響還是蠻重要的
痛點二
一般來說绽族,一個PHP腳本的執(zhí)行最大時長為30s(php.ini默認值)。
如果某些特殊的場景(例如離線數(shù)據(jù)同步衩藤,如果要查詢大量的數(shù)據(jù)會耗時比較長)吧慢,也會比較容易報超時錯誤。

解決以上通點可以通過websocket的方式實現(xiàn)赏表,也可以通過MQ實現(xiàn)(但是數(shù)據(jù)同步不及時)

我們先來模擬一下數(shù)據(jù)同步耗時問題
本文用的swoole實現(xiàn)websocket服務

swoole代碼如下

<?php
//include "db.php";

//創(chuàng)建WebSocket Server對象检诗,監(jiān)聽0.0.0.0:9502端口
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9501);

//監(jiān)聽WebSocket連接打開事件
$ws->on('Open', function ($ws, $request) {
    $ws->push($request->fd, "hello, welcome\n");
});

//監(jiān)聽WebSocket消息事件
$ws->on('Message', function ($ws, $frame) {
    //模擬超時環(huán)境
    sleep(50);
    $result = ["data"=>"長時間等待后獲取到到數(shù)據(jù)"];
    $data = json_encode($result,JSON_UNESCAPED_UNICODE);
    $ws->push($frame->fd, $data);
});

//監(jiān)聽WebSocket連接關閉事件
$ws->on('Close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
});

$ws->start();


啟動socket服務


image.png

js的websocket代碼如下

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8">
</head>
<body>
 <div id="output"></div>
</body>

<script type="text/javascript">
    var wsUri ="ws://127.0.0.1:9501/";
    var output; 
     
    function init() {
        output = document.getElementById("output");
        testWebSocket();
    } 
  
    function testWebSocket() {
        websocket = new WebSocket(wsUri);
        websocket.onopen = function(evt) {
            onOpen(evt)
        };
        websocket.onclose = function(evt) {
            onClose(evt)
        };
        websocket.onmessage = function(evt) {
            onMessage(evt)
        };
        websocket.onerror = function(evt) {
            onError(evt)
        };
    } 
  
    function onOpen(evt) {
        writeToScreen("CONNECTED");
        doSend("WebSocket rocks");
    } 
  
    function onClose(evt) {
        writeToScreen("DISCONNECTED");
    } 
  
    function onMessage(evt) {
        writeToScreen('<span style="color: blue;">RESPONSE: '+ evt.data+'</span>');
        websocket.close();
    } 
  
    function onError(evt) {
        writeToScreen('<span style="color: red;">ERROR:</span> '+ evt.data);
    } 
  
    function doSend(message) {
        writeToScreen("SENT: " + message); 
        websocket.send(message);
    } 
  
    function writeToScreen(message) {
        var pre = document.createElement("p");
        pre.style.wordWrap = "break-word";
        pre.innerHTML = message;
        output.appendChild(pre);
    } 
  
    window.addEventListener("load", init, false); 
</script>
</html>

測試結(jié)果


image.png

輕松解決長時間等待問題。而且每個socket都是鏈接都是獨立瓢剿,不相互影響逢慌,并行處理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末间狂,一起剝皮案震驚了整個濱河市攻泼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鉴象,老刑警劉巖忙菠,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纺弊,居然都是意外死亡牛欢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門淆游,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氢惋,“玉大人,你說我怎么就攤上這事稽犁⊙嫱” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵已亥,是天一觀的道長熊赖。 經(jīng)常有香客問我,道長虑椎,這世上最難降的妖魔是什么震鹉? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮捆姜,結(jié)果婚禮上传趾,老公的妹妹穿的比我還像新娘。我一直安慰自己泥技,他們只是感情好浆兰,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般簸呈。 火紅的嫁衣襯著肌膚如雪榕订。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天蜕便,我揣著相機與錄音劫恒,去河邊找鬼。 笑死轿腺,一個胖子當著我的面吹牛两嘴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播族壳,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼溶诞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了决侈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤喧务,失蹤者是張志新(化名)和其女友劉穎赖歌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體功茴,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡庐冯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坎穿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片展父。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖玲昧,靈堂內(nèi)的尸體忽然破棺而出栖茉,到底是詐尸還是另有隱情,我是刑警寧澤孵延,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布吕漂,位于F島的核電站,受9級特大地震影響尘应,放射性物質(zhì)發(fā)生泄漏惶凝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一犬钢、第九天 我趴在偏房一處隱蔽的房頂上張望苍鲜。 院中可真熱鬧,春花似錦玷犹、人聲如沸混滔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遍坟。三九已至拳亿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愿伴,已是汗流浹背肺魁。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留隔节,地道東北人鹅经。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像怎诫,于是被迫代替她去往敵國和親瘾晃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一幻妓、涉及的計算機基礎知識 通信網(wǎng)絡全雙工/單工/半雙工:1蹦误、單工:數(shù)據(jù)只在一個方向上傳輸,不能實現(xiàn)雙方通信肉津。如:閉...
    翁支和閱讀 5,132評論 0 4
  • 這幾天群里來了安正超大神,一下子群情'波'濤洶涌呀,什么强胰?你不知道超神是誰,這是他的個人網(wǎng)站可以去瞧一瞧. ......
    鄭方方閱讀 847評論 3 8
  • 本文整理了對Socket與WebSocket協(xié)議的理解,基于WebSocket聊天室的實現(xiàn)及實現(xiàn)原理妹沙,Worker...
    小馬過河R閱讀 880評論 4 8
  • 1.項目centos6.5基本環(huán)境部署 workerman要求php版本大于5.3 CentOS 6.5的epel...
    洛根森閱讀 556評論 0 1
  • 進程 什么是進程 進程Process是計算機中的程序關于某數(shù)據(jù)集合上的一次運行活動偶洋,是系統(tǒng)分配資源和調(diào)度的基本單位...
    JunChow520閱讀 2,037評論 2 9