欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > PHP長連接實現(xiàn)與使用方法詳解

PHP長連接實現(xiàn)與使用方法詳解

熱門標簽:離石地圖標注 專業(yè)電話機器人批發(fā)商 深圳外呼系統(tǒng)收費 電話機器人危險嗎 南寧高頻外呼回撥系統(tǒng)哪家好 400電話辦理福州市 江蘇外呼電銷機器人報價 長沙crm外呼系統(tǒng)業(yè)務 400電話申請方法收費

本文實例講述了PHP長連接實現(xiàn)與使用方法。分享給大家供大家參考,具體如下:

長連接技術(Long Polling)

在服務器端hold住一個連接, 不立即返回, 直到有數(shù)據(jù)才返回, 這就是長連接技術的原理

長連接技術的關鍵在于hold住一個HTTP請求, 直到有新數(shù)據(jù)時才響應請求, 然后客戶端再次自動發(fā)起長連接請求.

那怎么樣hold住一個請求呢?服務器端的代碼可能看起來像這樣的

set_time_limit(0); //這句很重要, 不至于運行超時
while (true) {
  if (hasNewMessage()) {
    echo json_encode(getNewMessage());
    break;
  }
  usleep(100000);   //避免太過頻繁的查詢
}

沒錯,就是通過循環(huán)來實現(xiàn)hold住一個請求, 不至于立即返回. 查詢到有新數(shù)據(jù)之后才響應請求. 然后客戶端處理數(shù)據(jù)后,再次發(fā)起長連接請求.

客戶端的代碼是像這樣的

script type="text/javascript">
  (function longPolling() {
    $.ajax({
      'url': 'server.php',
      'data': data,
      'dataType': 'json',
      'success': function(data) {
        processData(data);
        longPolling();
      },
      'error': function(data) {
        longPolling();
      }
    });
  })();
/script>

一個簡易的聊天室

通過長連接, 我們可以開發(fā)一個簡易的web聊天室

下面, 我們通過redis開發(fā)一個簡易的web聊天室

1. 每一個客戶端發(fā)起長連接時, 在服務器端生成一個消息隊列, 對應該用戶. 然后監(jiān)聽有無新數(shù)據(jù), 有則返回數(shù)據(jù)到客戶端進行處理, 并再起發(fā)起長連接請求.

2. 每一個客戶端發(fā)起消息時, 進行消息隊列的廣播.

下面是代碼片段:

?php
namespace church\LongPolling;
use Closure;
use church\LongPolling\Queue\RedisQueue;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
class Server
{
  public $event = [];
  public $redisQueue = null;
  public $request = null;
  public $response = null;
  public function __construct()
  {
    $this->redisQueue = new RedisQueue();
    $this->request = Request::createFromGlobals();
    $this->response = new JsonResponse();
  }
  public function on($event, Closure $closure)
  {
    if (is_callable($closure)) {
      $this->event[$event][] = $closure;
    }
  }
  public function fire($event)
  {
    if (isset($this->event[$event])) {
      foreach ($this->event[$event] as $callback) {
        call_user_func($callback, $this);
      }
    }
  }
  public function sendMessage($data)
  {
    switch ($data['type']) {
      case 'unicast':   //單播
        $this->unicast($data['target'], $data['data'], $data['resource']);
        break;
      case 'multicast':    //組播
        foreach ($data['target'] as $target) {
          $this->unicast($target, $data['data'], $data['resource']);
        }
        break;
      case 'broadcast':    //廣播
        foreach ($this->redisQueue->setQueueName('connections') as $target) {
          $this->unicast($target, $data['data'], $data['resource']);
        }
        break;
    }
    $this->fire('message');
  }
  public function unicast($target, $message, $resource = 'system')
  {
    $redis_queue = new RedisQueue();
    $redis_queue->setQueueName($target)->push($resource . ':' . $message);
  }
  public function getMessage($target)
  {
    return $this->redisQueue->setQueueName($target)->pop();
  }
  public function hasMessage($target)
  {
    return count($this->redisQueue->setQueueName($target));
  }
  public function run()
  {
    $data = $this->request->request;
    while (true) {
      if ($data->get('action') == 'getMessage') {
        if ($this->hasMessage($data->get('target'))) {
          $this->response->setData([
            'state' => 'ok',
            'message' => '獲取成功',
            'data' => $this->getMessage($data->get('target'))
          ]);
          $this->response->send();
          break;
        }
      } elseif ($data->get('action') == 'connect') {
        $exist = false;
        foreach ($this->redisQueue->setQueueName('connections') as $connection) {
          if ($connection == $data->get('data')) {
            $exist = true;
          }
        }
        if (! $exist) {
          $this->redisQueue->setQueueName('connections')->push($data->get('data'));
        }
        $this->fire('connect');
        break;
      }
      usleep(100000);
    }
  }
}

長連接避免了過于頻繁的輪詢. 但服務器維持一個長連接也有額外的資源消耗. 大并發(fā)時性能不理想. 在小型應用里面可以考慮使用

更建議客戶端使用html5的websocket協(xié)議, 服務器端使用swoole.

有關swoole, 你可以查看官網(wǎng):https://www.swoole.com/

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php socket用法總結》、《php字符串(string)用法總結》、《PHP數(shù)學運算技巧總結》、《php面向對象程序設計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP數(shù)據(jù)結構與算法教程》、《php程序設計算法總結》及《PHP網(wǎng)絡編程技巧總結》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • PHP使用Redis長連接的方法詳解
  • PHP擴展模塊memcached長連接使用方法分析
  • 基于php實現(xiàn)長連接的方法與注意事項的問題
  • PHP set_time_limit(0)長連接的實現(xiàn)分析
  • 基于HTTP長連接的"服務器推"技術的php 簡易聊天室
  • PHP編程實現(xiàn)的TCP服務端和客戶端功能示例
  • php實現(xiàn)TCP端口檢測的方法
  • 詳解PHP Swoole長連接常見問題

標簽:南京 興安盟 曲靖 濱州 白酒營銷 株洲 太原 南昌

巨人網(wǎng)絡通訊聲明:本文標題《PHP長連接實現(xiàn)與使用方法詳解》,本文關鍵詞  PHP,長,連接,實現(xiàn),與,使用方法,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP長連接實現(xiàn)與使用方法詳解》相關的同類信息!
  • 本頁收集關于PHP長連接實現(xiàn)與使用方法詳解的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产+高潮+白浆+无码| 日本高清黄色片| 精品人妻少妇嫩草av无码| 亚洲精品天堂网| 色国产综合视频| 欧美电影免费观看高清完整版在线观看 | 国产一卡二卡三卡四卡| 日本在线观看网址| 久久久久99精品国产片| 亚洲综合另类小说| 国产不卡视频在线播放| 无码人妻aⅴ一区二区三区 | 国内成人自拍视频| 91麻豆国产在线观看| www..com.cn蕾丝视频在线观看免费版 | 成人久久18免费网站麻豆| 久久久久久久久久久久国产精品| youjizz亚洲女人| 欧美一区二区三区视频在线观看 | 色诱亚洲精品久久久久久| 日韩精品一区二区三区蜜臀| 麻豆久久久久久久| 这里只有精品在线观看视频| 欧美一区二区三区电影| 日本少妇一区二区| 在线观看亚洲免费视频| 在线观看91精品国产麻豆| 中文字幕五月欧美| 国产精品中文字幕日韩精品| 搡老熟女老女人一区二区| 精品久久久久久久久久久院品网| 亚洲精品久久久久久国产精华液| 国产精品99久久久久| 国产成人免费在线观看视频| 精品国产露脸精彩对白 | 亚洲国产精品久久艾草纯爱| 成人免费观看视频| 在线精品视频免费播放| 亚洲丝袜另类动漫二区| 成人黄色片在线观看| 亚洲天堂av中文字幕| 国产精品亲子伦对白| 国产成人精品免费| 在线观看91精品国产入口| 性做久久久久久| 成人欧美精品一区二区| 日韩欧美国产精品| 国产成人在线视频网址| 欧美无乱码久久久免费午夜一区| 亚洲桃色在线一区| 2018国产精品| 精品成人在线观看| 成人一道本在线| 欧美精品欧美精品系列| 美女网站视频久久| 超碰手机在线观看| 自拍偷自拍亚洲精品播放| 亚洲欧美高清在线| 国产午夜亚洲精品不卡| 国产成人免费av在线| 欧美性猛片xxxx免费看久爱| 麻豆久久一区二区| 在线亚洲+欧美+日本专区| 日韩中文欧美在线| 中文字幕一二三四区| 久久中文字幕电影| 国产91在线|亚洲| 欧美 日韩 国产 一区二区三区| 亚洲欧洲av在线| 男男做爰猛烈叫床爽爽小说| 精品久久五月天| 99热99精品| 在线亚洲一区观看| 精品夜夜嗨av一区二区三区| 亚洲精品自拍视频在线观看| 一二三四社区欧美黄| a天堂视频在线观看| 日本一区二区三区国色天香| 成人国产精品视频| 日韩三级.com| 国产精品白丝jk黑袜喷水| 欧美日韩高清在线| 亚洲va天堂va国产va久| 国产精品久久久免费看| 日精品一区二区| 日本一级二级视频| 国产真实乱偷精品视频免| 欧美视频中文字幕| 懂色av一区二区三区免费看| 欧美sm美女调教| 在线观看免费视频黄| 中文字幕一区二区三区蜜月| www.黄色在线| 国产精品午夜在线观看| 青青草精品在线| 欧美大片顶级少妇| 亚洲欧洲国产视频| 国产精品久久精品日日| 日本不卡视频一区| 亚洲欧美电影一区二区| 人妻丰满熟妇aⅴ无码| 亚洲激情五月婷婷| 国产免费无码一区二区视频| 国产一区二区三区四区在线观看| 91精品福利在线| 国产成人在线网站| 国产午夜精品一区二区| 精品人妻无码一区二区三区换脸| 国产精品第13页| 黑人と日本人の交わりビデオ| 日本不卡视频在线| 91精品国产黑色紧身裤美女| 特种兵之深入敌后| 亚洲另类在线一区| 色综合中文字幕国产 | 欧美一区二区三区爱爱| 人妻激情偷乱视频一区二区三区| 国产精品成人一区二区三区夜夜夜| 欧美老女人性生活视频| 久久精品噜噜噜成人av农村| 91国偷自产一区二区开放时间| 国产99久久久国产精品免费看| 久久久久久久久久电影| 人人妻人人澡人人爽| 奇米精品一区二区三区在线观看 | 久久99国产精品免费| 日韩午夜激情电影| 国产网站无遮挡| 日韩av在线免费观看不卡| 91精品国产一区二区三区香蕉 | 日韩一级视频免费观看在线| 国产日韩视频一区| 天天色综合天天| 欧美在线视频不卡| www.日韩精品| 亚洲美女偷拍久久| 欧美午夜影院一区| 亚洲一区和二区| 午夜精品在线看| 日韩小视频在线观看专区| 性色av蜜臀av色欲av| 麻豆国产91在线播放| 久久日韩粉嫩一区二区三区| 精品人体无码一区二区三区| 国产精品乡下勾搭老头1| 中文字幕日韩av资源站| 欧美影视一区在线| a级片在线观看视频| 日本不卡一二三| 国产亚洲精品超碰| 亚洲天堂网av在线| 久久99国产精品麻豆| 欧美国产综合色视频| 色一区在线观看| 熟女人妻一区二区三区免费看| 午夜欧美2019年伦理| 精品国产免费视频| 亚洲女人久久久| 91视频免费播放| 视频一区在线视频| 久久精品亚洲一区二区三区浴池| 97在线观看免费高| 中国男女全黄大片| 一区二区三区四区激情| 69久久99精品久久久久婷婷| 中文字幕成人动漫| 成人黄色片在线观看| 亚洲成人动漫精品| 久久亚洲一区二区三区四区| www.av视频| 亚洲图片综合网| 国产精品一区在线观看你懂的| 亚洲欧美日韩一区二区三区在线观看| 欧美日韩视频不卡| 日本不卡视频一区| 国产一二三精品| 一区二区三区日韩欧美| 精品免费99久久| 一本色道**综合亚洲精品蜜桃冫| 国产国语老龄妇女a片| 国产一区二区三区国产| 亚洲精品伦理在线| 欧美精品一区二区三区高清aⅴ| 色综合天天天天做夜夜夜夜做| 性欧美18—19sex性高清| 国产激情一区二区三区桃花岛亚洲| 亚洲美女一区二区三区| 26uuu精品一区二区在线观看| 色88888久久久久久影院野外| 久久人人爽人人爽人人片| zzijzzij亚洲日本少妇熟睡| 日韩av电影免费观看高清完整版 | 国产ts丝袜人妖系列视频 | 欧亚洲嫩模精品一区三区| 亚洲精品成人无码熟妇在线| 99久久精品一区| 亚洲乱码国产乱码精品精可以看| 欧美xxx久久| 欧美日韩在线播| 91狠狠综合久久久|