婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP長連接實現與使用方法詳解

PHP長連接實現與使用方法詳解

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

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

長連接技術(Long Polling)

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

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

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

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

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

客戶端的代碼是像這樣的

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>

一個簡易的聊天室

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

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

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

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

下面是代碼片段:

?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);
    }
  }
}

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

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

有關swoole, 你可以查看官網:https://www.swoole.com/

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

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

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

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

巨人網絡通訊聲明:本文標題《PHP長連接實現與使用方法詳解》,本文關鍵詞  PHP,長,連接,實現,與,使用方法,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP長連接實現與使用方法詳解》相關的同類信息!
  • 本頁收集關于PHP長連接實現與使用方法詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩理论片在线| 国产精品不卡在线| eeuss鲁片一区二区三区在线看| 激情欧美日韩一区二区| 不卡一区二区中文字幕| 色综合久久久久综合体| 欧美色综合网站| 日韩高清国产一区在线| 欧美成人在线直播| 欧美精品tushy高清| 成人黄色免费短视频| 国产精品亚洲午夜一区二区三区 | 欧美肥胖老妇做爰| 中文字幕永久在线不卡| 99精品久久久久久| 亚洲一区二区欧美日韩| 欧美在线你懂的| 亚洲成人av一区二区三区| 欧美一区午夜精品| 狠狠色综合色综合网络| 国产精品一二三区在线| 国产精品无人区| 日韩视频一区在线观看| 成人av在线电影| 亚洲色图在线播放| 精品久久久久久久久久久久包黑料| 国模套图日韩精品一区二区| 欧美成人激情免费网| 国产麻豆精品95视频| 亚洲福利视频三区| 欧美亚洲一区二区在线| 久久99精品国产91久久来源| 亚洲电影一级片| 久久久一区二区三区| 欧美高清精品3d| 欧美午夜寂寞影院| 欧美xxxx在线观看| 色综合久久综合中文综合网| 日韩av在线免费观看不卡| jlzzjlzz欧美大全| 日本aⅴ亚洲精品中文乱码| 日韩二区在线观看| 日韩avvvv在线播放| 日本中文一区二区三区| 一二三四社区欧美黄| 久久综合狠狠综合久久综合88| 国产肉丝袜一区二区| 国产精品成人免费在线| 亚洲人成电影网站色mp4| 亚洲第四色夜色| 国产成人精品网址| 在线观看国产日韩| 日韩一区二区在线免费观看| 亚洲天堂av老司机| 国产一区在线看| 欧美性猛交xxxx乱大交退制版| 精品国产乱码久久久久久久 | 一区二区三区四区av| 欧美精品一区二区不卡| 色综合中文字幕| 激情文学综合网| 国产精品家庭影院| 国产女人aaa级久久久级| 欧美精品久久一区二区三区| 91在线观看美女| 成人激情图片网| 亚洲午夜av在线| 日韩亚洲欧美中文三级| 久久夜色精品国产噜噜av| 中文字幕欧美激情一区| 午夜一区二区三区视频| 久久一区二区三区四区| 国内成+人亚洲+欧美+综合在线| 宅男在线国产精品| 日本一区免费视频| 国产激情一区二区三区桃花岛亚洲| 777久久久精品| 激情综合网最新| 久久综合一区二区| 国产乱码精品一区二区三区忘忧草| 精品国产伦一区二区三区免费 | 日韩国产精品久久| 国产suv精品一区二区6| 欧美精品一区二区三区一线天视频 | 国产福利一区在线观看| 精品国产免费人成在线观看| 色呦呦日韩精品| 国产欧美在线观看一区| 国产精品亚洲人在线观看| 奇米色一区二区| 综合欧美一区二区三区| 中文字幕av在线一区二区三区| 午夜精品久久久久久久| 丝袜美腿亚洲综合| 欧美哺乳videos| 国产丶欧美丶日本不卡视频| 精品久久久久一区二区国产| 国内精品嫩模私拍在线| 91精品一区二区三区久久久久久 | 国产美女久久久久| 久久综合99re88久久爱| 国产视频不卡一区| 欧美军同video69gay| 91在线国内视频| 成人手机在线视频| 国内精品视频666| 午夜电影网亚洲视频| 亚洲一区二区免费视频| 亚洲欧洲美洲综合色网| 亚洲va韩国va欧美va精品| 国产成人综合自拍| 粉嫩一区二区三区性色av| 欧美日韩一区二区在线观看 | 91看片淫黄大片一级在线观看| 成人午夜私人影院| 国产在线不卡一区| 久久se精品一区精品二区| 国产日韩精品一区| 日韩欧美在线影院| 91天堂素人约啪| 一区二区成人在线| av电影在线观看一区| 中文字幕在线不卡视频| 在线视频欧美精品| 亚洲精品乱码久久久久久日本蜜臀| 国产精品888| 国产欧美一区视频| 欧美日韩另类一区| 国产精品一区二区果冻传媒| 国产精品久久影院| 成人美女在线观看| 欧美高清www午色夜在线视频| 欧美tickling网站挠脚心| 在线观看免费亚洲| 国产一区二区看久久| ㊣最新国产の精品bt伙计久久| 91亚洲资源网| 亚洲超碰精品一区二区| 91蜜桃免费观看视频| 国产精品成人午夜| 欧美精品一区视频| 91蜜桃网址入口| 日本欧美韩国一区三区| 中文字幕第一区二区| 91国产丝袜在线播放| 欧美一区二区三区婷婷月色| 久久99这里只有精品| 欧美sm美女调教| 欧美精品日韩一本| 成人一级片网址| 国产美女一区二区三区| 美国十次了思思久久精品导航| 日韩欧美亚洲国产精品字幕久久久| 91精品福利视频| 欧美顶级少妇做爰| 亚洲a一区二区| 秋霞国产午夜精品免费视频| 国产成人免费视频 | 日韩电影在线一区| 国产精品影视在线| 中文字幕色av一区二区三区| 97se亚洲国产综合自在线观| 色噜噜偷拍精品综合在线| 一本大道久久a久久综合| 欧美在线观看你懂的| 欧美精品色综合| 欧美一区二区视频在线观看2022| 欧美高清性hdvideosex| 精品国产91久久久久久久妲己| 精品sm在线观看| 亚洲欧美综合在线精品| 亚洲成a人在线观看| 亚洲夂夂婷婷色拍ww47| 天天操天天色综合| 激情综合色综合久久| 99精品视频在线观看| 欧美日韩久久一区| 国产日韩精品一区二区三区在线| 精品国产免费视频| 久久综合色8888| 国产精品日产欧美久久久久| 亚洲激情在线激情| 另类小说一区二区三区| 国产精品一线二线三线精华| 99vv1com这只有精品| 粗大黑人巨茎大战欧美成人| 国产高清视频一区| 国产一区二区三区在线看麻豆| 日韩高清不卡一区| 国产成人av一区| 国产精品免费av| 91毛片在线观看| 不卡视频在线看| 亚洲精品国产成人久久av盗摄| 精品一二三四区| 国产成人精品影视| 一级日本不卡的影视| 欧美一区二区三区四区在线观看| 色婷婷av久久久久久久| 日本女人一区二区三区|