欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何實(shí)現(xiàn)基于workerman的實(shí)時(shí)推送-創(chuàng)新互聯(lián)

如何實(shí)現(xiàn)基于workerman的實(shí)時(shí)推送,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到房縣網(wǎng)站設(shè)計(jì)與房縣網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋房縣地區(qū)。

下面由workerman教程欄目給大家介紹實(shí)現(xiàn)基于workerman的實(shí)時(shí)推送,摒棄ajax輪詢(xún)的方法,希望對(duì)需要的朋友有所幫助!

先扯些這些內(nèi)容:

TCP/IP

TCP/IP是個(gè)協(xié)議組,可分為三個(gè)層次:網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。

在網(wǎng)絡(luò)層有IP協(xié)議、ICMP協(xié)議、ARP協(xié)議、RARP協(xié)議和BOOTP協(xié)議。

在傳輸層中有TCP協(xié)議與UDP協(xié)議。

在應(yīng)用層有:

TCP包括FTP、HTTP、TELNET、SMTP等協(xié)議

UDP包括DNS、TFTP等協(xié)議

短連接

連接->傳輸數(shù)據(jù)->關(guān)閉連接

HTTP是無(wú)狀態(tài)的,瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接,但任務(wù)結(jié)束就中斷連接。

也可以這樣說(shuō):短連接是指SOCKET連接后發(fā)送后接收完數(shù)據(jù)后馬上斷開(kāi)連接。

長(zhǎng)連接

連接->傳輸數(shù)據(jù)->保持連接 -> 傳輸數(shù)據(jù)-> 。。。 ->關(guān)閉連接。

長(zhǎng)連接指建立SOCKET連接后不管是否使用都保持連接,但安全性較差。

http的長(zhǎng)連接

HTTP也可以建立長(zhǎng)連接的,使用Connection:keep-alive,HTTP 1.1默認(rèn)進(jìn)行持久連接。HTTP1.1和HTTP1.0相比較而言,較大的區(qū)別就是增加了持久連接支持(貌似新的 http1.0 可以顯示的指定 keep-alive),但還是無(wú)狀態(tài)的,或者說(shuō)是不可以信任的。

什么時(shí)候用長(zhǎng)連接,短連接?

長(zhǎng)連接多用于操作頻繁,點(diǎn)對(duì)點(diǎn)的通訊,而且連接數(shù)不能太多情況,。每個(gè)TCP連接都需要三步握手,這需要時(shí)間,如果每個(gè)操作都是先連接,再操作的話那么處理速度會(huì)降低很多,所以每個(gè)操作完后都不斷開(kāi),次處理時(shí)直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連接。例如:數(shù)據(jù)庫(kù)的連接用長(zhǎng)連接, 如果用短連接頻繁的通信會(huì)造成socket錯(cuò)誤,而且頻繁的socket 創(chuàng)建也是對(duì)資源的浪費(fèi)。

而像WEB網(wǎng)站的http服務(wù)一般都用短鏈接,因?yàn)殚L(zhǎng)連接對(duì)于服務(wù)端來(lái)說(shuō)會(huì)耗費(fèi)一定的資源,而像WEB網(wǎng)站這么頻繁的成千上萬(wàn)甚至上億客戶(hù)端的連接用短連接會(huì)更省一些資源,如果用長(zhǎng)連接,而且同時(shí)有成千上萬(wàn)的用戶(hù),如果每個(gè)用戶(hù)都占用一個(gè)連接的話,那可想而知吧。所以并發(fā)量大,但每個(gè)用戶(hù)無(wú)需頻繁操作情況下需用短連好。

workerman是啥子?Workerman是一款純PHP開(kāi)發(fā)的開(kāi)源高性能的PHP socket 服務(wù)器框架。被廣泛的用于手機(jī)app、移動(dòng)通訊,微信小程序,手游服務(wù)端、網(wǎng)絡(luò)游戲、PHP聊天室、硬件通訊、智能家居、車(chē)聯(lián)網(wǎng)、物聯(lián)網(wǎng)等領(lǐng)域的開(kāi)發(fā)。 支持TCP長(zhǎng)連接,支持Websocket、HTTP等協(xié)議,支持自定義協(xié)議。擁有異步Mysql、異步Redis、異步Http、異步消息隊(duì)列等眾多高性能組件。

開(kāi)始步入正題:為了達(dá)到實(shí)時(shí)通訊,很多時(shí)候我們采用了ajax輪詢(xún)機(jī)制,如圖:

后面可以采用workerman方式來(lái)實(shí)現(xiàn),項(xiàng)目也是tp寫(xiě)的,官方手冊(cè)這么說(shuō)到

與其它mvc框架結(jié)合建議以上圖的方式(ThinkPHP為例):

1、ThinkPHP與Workerman是兩個(gè)獨(dú)立的系統(tǒng),獨(dú)立部署(可部署在不同服務(wù)器),互不干擾。

2、ThinkPHP以HTTP協(xié)議提供網(wǎng)頁(yè)頁(yè)面在瀏覽器渲染展示。

3、ThinkPHP提供的頁(yè)面的js發(fā)起websocket連接,連接workerman

4、連接后給Workerman發(fā)送一個(gè)數(shù)據(jù)包(包含用戶(hù)名密碼或者某種token串)用于驗(yàn)證websocket連接屬于哪個(gè)用戶(hù)。

5、僅在ThinkPHP需要向?yàn)g覽器推送數(shù)據(jù)時(shí),才調(diào)用workerman的socket接口推送數(shù)據(jù)。

6、其余請(qǐng)求還是按照原本ThinkPHP的HTTP方式調(diào)用處理。

總結(jié):

把Workerman作為一個(gè)可以向?yàn)g覽器推送的通道,僅僅在需要向?yàn)g覽器推送數(shù)據(jù)時(shí)才調(diào)用Workerman接口完成推送。業(yè)務(wù)邏輯全部在ThinkPHP中完成。

ok,到這里,把workerman容器跑起來(lái),注意這里是CLI模式運(yùn)行

然后再我們項(xiàng)目接收信息中這么玩,附上代碼

<script>
    // 連接服務(wù)端
    var socket = io('http://127.0.0.1:2120');
    // uid可以是自己網(wǎng)站的用戶(hù)id,以便針對(duì)uid推送
    uid = 123;
    // socket連接后以u(píng)id登錄
    socket.on('connect', function(){
    socket.emit('login', uid);
    });
    // 后端推送來(lái)消息時(shí)
    socket.on('new_msg', function(msg){
        console.log("收到消息:"+msg);  //自己業(yè)務(wù)邏輯處理
    });
    
</script>

接著,我們?cè)谟脩?hù)向用戶(hù)發(fā)送信息的時(shí)候添加

// 指明給誰(shuí)推送,為空表示向所有在線用戶(hù)推送
        $to_uid = "123";
        // 推送的url地址
        $push_api_url = "http://127.0.0.1:2121/";
        $post_data = array(
           "type" => "publish",
           "content" => "數(shù)據(jù)",
           "to" => $to_uid, 
        );
        $ch = curl_init ();
        curl_setopt ( $ch, CURLOPT_URL, $push_api_url );
        curl_setopt ( $ch, CURLOPT_POST, 1 );
        curl_setopt ( $ch, CURLOPT_HEADER, 0 );
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data );
        curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Expect:"));
        $return = curl_exec ( $ch );
        curl_close ( $ch );
        var_export($return);

其中,workerman里面的推送核心代碼實(shí)現(xiàn)

// 全局?jǐn)?shù)組保存uid在線數(shù)據(jù)
$uidConnectionMap = array();
// 記錄最后一次廣播的在線用戶(hù)數(shù)
$last_online_count = 0;
 
 
// PHPSocketIO服務(wù)
$sender_io = new SocketIO(2120);
// 客戶(hù)端發(fā)起連接事件時(shí),設(shè)置連接socket的各種事件回調(diào)
 
// 當(dāng)$sender_io啟動(dòng)后監(jiān)聽(tīng)一個(gè)http端口,通過(guò)這個(gè)端口可以給任意uid或者所有uid推送數(shù)據(jù)
$sender_io->on('workerStart', function(){
    // 監(jiān)聽(tīng)一個(gè)http端口
    $inner_http_worker = new Worker('http://0.0.0.0:2121');
    // 當(dāng)http客戶(hù)端發(fā)來(lái)數(shù)據(jù)時(shí)觸發(fā)
    $inner_http_worker->onMessage = function($http_connection, $data){
        global $uidConnectionMap;
        $_POST = $_POST ? $_POST : $_GET;
        // 推送數(shù)據(jù)的url格式 type=publish&to=uid&content=xxxx
        switch(@$_POST['type']){
            case 'publish':
                global $sender_io;
                $to = @$_POST['to'];
                $_POST['content'] = htmlspecialchars(@$_POST['content']);
                // 有指定uid則向uid所在socket組發(fā)送數(shù)據(jù)
                if($to){
                    $sender_io->to($to)->emit('new_msg', $_POST['content']);
                // 否則向所有uid推送數(shù)據(jù)
                }else{
                    $sender_io->emit('new_msg', @$_POST['content']);
                }
                // http接口返回,如果用戶(hù)離線socket返回fail
                if($to && !isset($uidConnectionMap[$to])){
                    return $http_connection->send('offline');
                }else{
                    return $http_connection->send('ok');
                }
        }
        return $http_connection->send('fail');
    };
    
});
 
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

ok,大功告成!

看完上述內(nèi)容,你們掌握如何實(shí)現(xiàn)基于workerman的實(shí)時(shí)推送的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

文章標(biāo)題:如何實(shí)現(xiàn)基于workerman的實(shí)時(shí)推送-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)于:http://aaarwkj.com/article14/gjpde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站維護(hù)、定制開(kāi)發(fā)定制網(wǎng)站、標(biāo)簽優(yōu)化、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
亚洲日本日本午夜精品| 亚洲 精品一区二区| 老女人性生交大片免费| 国产亚洲成人精品一区| 好看毛片一区二区三区四区| 国产精品久久99精品| 亚洲香蕉av在线一区二区三区| 91一区二区三区在线| 亚洲av色福免费网站| 黄色av免费无毒网站| 亚洲欧美一区二区中文字幕| 久久久久久精品国产免费| 五月天丁香婷婷一区二区| 午夜激情视频福利在线观看| 久草福利在线观看免费| 日韩av在线免费在线观看| 青青草青娱乐免费在线视频| 四虎在线观看最新入口| 国产性色精品一区二区| 国产亚洲综合区成人国产| 麻豆精品情欲人妻一区| 男人的天堂在线观看黄片| 午夜免费成人在线视频| 亚洲熟女av一区少妇| 美女张开腿让男人插进去| 午夜福利一区二区在线| 激情婷婷亚洲五月综合网| 亚洲黄色av网站在线| 亚洲码与欧洲码一二三| 动漫美女视频在线看黄| 日韩av高清在线播放| 高潮内射主播自拍一区| 黄色片一区二区三区四区| 91精品一区二区三区91人妻| 国产999精品在线观看| 国产b片免费在线观看| 亚洲精品女同专区视频| 亚洲av男人电影天堂| 未满十八禁止免费视频| 九色综合一区二区三区| 亚洲欧美日韩制服另类|