婷婷综合国产,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
    久久99国产精品免费网站| av在线播放成人| 成人精品免费看| 69久久夜色精品国产69蝌蚪网| 久久精品一区二区三区不卡牛牛| 亚洲成a人片在线观看中文| 成熟亚洲日本毛茸茸凸凹| 91精品国产综合久久久久久| 尤物视频一区二区| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 精品无人区卡一卡二卡三乱码免费卡| 色婷婷国产精品| 久久精品一区二区三区四区| 天堂午夜影视日韩欧美一区二区| 99精品黄色片免费大全| 国产日韩欧美精品一区| 国产又黄又大久久| 欧美一区二区精品久久911| 一区二区三区四区蜜桃| 99久久婷婷国产综合精品| 国产免费成人在线视频| 国产精品18久久久久久久久| 日韩一区二区免费在线观看| 视频一区国产视频| 91精品在线免费| 午夜av区久久| 欧美一区二区三区精品| 性做久久久久久免费观看| 欧美日韩亚洲高清一区二区| 亚洲线精品一区二区三区八戒| 色域天天综合网| 一区二区激情小说| 精品视频资源站| 日韩国产一二三区| 日韩一区二区三区在线| 精品综合久久久久久8888| 精品国产免费视频| 懂色av一区二区三区免费观看| 日本一区免费视频| 色综合天天性综合| 亚洲国产欧美一区二区三区丁香婷| 在线视频欧美精品| 日韩电影一区二区三区| 亚洲精品在线免费观看视频| 成人免费视频播放| 亚洲制服丝袜在线| 日韩一区二区三区视频在线| 蜜桃免费网站一区二区三区| 久久久久久麻豆| 99精品视频免费在线观看| 亚洲国产乱码最新视频| 日韩一卡二卡三卡| 成熟亚洲日本毛茸茸凸凹| 亚洲一区二区精品久久av| 日韩三级中文字幕| 成人激情视频网站| 亚洲123区在线观看| 精品国产凹凸成av人网站| 99久久国产免费看| 亚洲成人高清在线| 国产蜜臀av在线一区二区三区| 91啪亚洲精品| 久草中文综合在线| 亚洲欧洲av在线| 日韩免费福利电影在线观看| 成人性视频网站| 香港成人在线视频| 日本一区二区在线不卡| 欧美性淫爽ww久久久久无| 久久精品国产亚洲一区二区三区| 亚洲欧洲成人av每日更新| 日韩一二三区不卡| 色综合天天综合网天天看片| 国产一区欧美一区| 午夜精品福利一区二区蜜股av | 日本一区二区三区在线不卡 | 93久久精品日日躁夜夜躁欧美| 丝瓜av网站精品一区二区| 国产欧美一区二区三区网站| 制服丝袜一区二区三区| 99久免费精品视频在线观看| 美国av一区二区| 亚洲一线二线三线视频| 国产欧美日韩另类视频免费观看| 欧美肥妇毛茸茸| 日本高清不卡aⅴ免费网站| 国产91色综合久久免费分享| 蜜桃视频在线观看一区二区| 一区二区三区国产豹纹内裤在线| 国产欧美精品一区| 久久精品综合网| 精品免费视频.| 日韩一卡二卡三卡| 欧美精品丝袜久久久中文字幕| 色婷婷久久久久swag精品| 91一区二区在线观看| 成人一区二区视频| 国产成人高清在线| 国产一区视频在线看| 九一久久久久久| 卡一卡二国产精品 | 午夜伦欧美伦电影理论片| 一区二区三区在线播放| 亚洲天堂2016| 亚洲九九爱视频| 亚洲精品久久久久久国产精华液| 国产精品丝袜久久久久久app| 久久久亚洲午夜电影| 国产偷v国产偷v亚洲高清| 久久久99久久精品欧美| 国产午夜精品一区二区三区四区 | 51久久夜色精品国产麻豆| 欧美日韩国产经典色站一区二区三区| 色综合久久88色综合天天6| 91色视频在线| 欧美性做爰猛烈叫床潮| 欧美精品日韩一本| 欧美精品tushy高清| 日韩免费在线观看| 久久免费看少妇高潮| 中文字幕第一页久久| 亚洲天堂av一区| 午夜精品久久一牛影视| 久久精品国产澳门| 国产成人亚洲综合a∨婷婷| av资源站一区| 日本乱人伦aⅴ精品| 91精品在线观看入口| 久久久不卡影院| 日韩美女精品在线| 亚洲成人高清在线| 激情五月激情综合网| aaa欧美日韩| 欧美精品色一区二区三区| 久久一二三国产| 亚洲欧美欧美一区二区三区| 亚洲第一久久影院| 国产在线精品一区二区夜色| 99精品偷自拍| 欧美一区二区三区免费大片| 国产欧美一区二区三区网站| 亚洲一区二区欧美激情| 美国欧美日韩国产在线播放| 北条麻妃一区二区三区| 制服丝袜日韩国产| 中文字幕第一区综合| 日韩电影在线观看电影| 成人app下载| 欧美一级精品大片| 国产精品蜜臀在线观看| 免费看精品久久片| 91在线观看免费视频| 精品国产乱码久久久久久1区2区| 亚洲婷婷综合久久一本伊一区| 免费成人av在线| 91久久精品日日躁夜夜躁欧美| 精品欧美一区二区三区精品久久| 亚洲欧美日韩小说| 国产麻豆视频精品| 欧美高清视频一二三区 | 一区二区三区免费网站| 国产一区二区三区四区五区入口| 色综合久久99| 国产亚洲综合色| 免费不卡在线观看| 欧美日韩在线免费视频| 国产精品夫妻自拍| 国产久卡久卡久卡久卡视频精品| 欧美在线不卡视频| 亚洲同性同志一二三专区| 国产成人自拍网| 日韩免费在线观看| 免费成人深夜小野草| 欧美剧情片在线观看| 伊人婷婷欧美激情| 91色porny| 国产精品动漫网站| 成人性生交大片免费看中文网站| 精品国精品自拍自在线| 美腿丝袜亚洲色图| 日韩一卡二卡三卡四卡| 婷婷综合五月天| 欧美日韩国产首页| 亚洲午夜在线视频| 在线观看av不卡| 亚洲国产人成综合网站| 欧美曰成人黄网| 一区二区在线电影| 欧美综合视频在线观看| 亚洲精选一二三| 欧美亚洲综合在线| 亚洲韩国一区二区三区| 欧美日韩五月天| 天天亚洲美女在线视频| 欧美一区二区三区在线电影 | 亚洲成av人片在www色猫咪| 欧美性大战久久久久久久| 亚洲综合色在线| 欧美日韩免费高清一区色橹橹| 亚洲国产另类av|