1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      如何在PHP項(xiàng)目中使用Redis長(zhǎng)連接-創(chuàng)新互聯(lián)

      本篇文章給大家分享的是有關(guān)如何在PHP項(xiàng)目中使用Redis長(zhǎng)連接,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

      為龍泉驛等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及龍泉驛網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、龍泉驛網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

      pconnect函數(shù)聲明


      其中time_out表示客戶端閑置多少秒后,就斷開連接。函數(shù)連接成功返回true,失敗返回false:

      pconnect(host, port, time_out, persistent_id, retry_interval)
          host: string. can be a host, or the path to a unix domain socket
          port: int, optional
          timeout: float, value in seconds (optional, default is 0 meaning unlimited)
          persistent_id: string. identity for the requested persistent connection
          retry_interval: int, value in milliseconds (optional)

      下面的例子詳細(xì)介紹了pconnect連接的重用情況。

      $redis->pconnect('127.0.0.1', 6379);
      $redis->pconnect('127.0.0.1'); // 默認(rèn)端口6379,跟上面的例子使用相同的連接。
      $redis->pconnect('127.0.0.1', 6379, 2.5); // 設(shè)置了2.5秒的過期時(shí)間。將是不同于上面的新連接
      $redis->pconnect('127.0.0.1', 6379, 2.5, 'x'); //設(shè)置了持久連接的id,將是不同于上面的新連接
      $redis->pconnect('/tmp/redis.sock'); // unix domain socket - would be another connection than the four before.

      pconnect使用介紹

      對(duì)pconnect方法簡(jiǎn)單描述

      使用該方法創(chuàng)建連接,連接不會(huì)在調(diào)用close方法之后關(guān)閉,只有在進(jìn)程結(jié)束之后該連接才會(huì)被關(guān)閉。

      [待驗(yàn)證]如果使用的是長(zhǎng)連接,Redis配置文件中的timeout配置項(xiàng)需要設(shè)置為0,否則連接池中的連接會(huì)因?yàn)槌瑫r(shí)而失效

      針對(duì)PHP-FPM來說明一下pconnect

      長(zhǎng)連接只會(huì)在PHP-FPM進(jìn)程結(jié)束之后結(jié)束,連接的生命周期就是PHP-FPM進(jìn)程的生命周期。
      相比較短連接而言,在每一個(gè)PHP-FPM調(diào)用過程中都會(huì)產(chǎn)生一個(gè)redis的連接,在服務(wù)器上的表性形式就是過多的time_out連接狀態(tài)。
      而長(zhǎng)連接相反,PHP-FPM調(diào)用的所有CGI都只會(huì)共用一個(gè)長(zhǎng)連接,所以也就是只會(huì)產(chǎn)生固定數(shù)量的time_out。

      關(guān)閉長(zhǎng)連接

      可以調(diào)用close和unset方法,但兩則差異很大:

      - close的作用僅僅是使當(dāng)前PHP進(jìn)程不能再進(jìn)行redis請(qǐng)求,但無法真正關(guān)閉redis長(zhǎng)連接,連接在后續(xù)請(qǐng)求中仍然會(huì)被重用,直FPM進(jìn)程生命周期結(jié)束。所以close 并不會(huì)銷毀redis對(duì)象,只是斷開連接而已。

      - unset 變量才會(huì)銷毀。也需要注意并不是使用了 pconnect 就不要 close 了,如果當(dāng)前腳本執(zhí)行時(shí)間很長(zhǎng) 那么也會(huì)一直占用一個(gè)連接的。

      如何判斷當(dāng)前Redis是否處于連接狀態(tài)

      等效的問題是,在單例模式中,判斷當(dāng)前實(shí)例是否有效。

      習(xí)慣上調(diào)用echo,判斷是否正常返回字符串本身,或者調(diào)用ping,查看返回值是否為 +PONG。

      但是需要特別小心的是,在redis斷開連接之后,調(diào)用echo以及ping(返回'+POMG')時(shí),均會(huì)拋出異常。所以要通過異常捕獲機(jī)制來處理。

      代碼分析pconnect連接重用的問題

      情況一:非單例模式。

      說明:a實(shí)例和b實(shí)例共用了一條連接,b實(shí)例將a實(shí)例的連接修改了:
      所以下面的例子導(dǎo)致最終$a實(shí)例得到的值變成了2,需要特別注意。

      $a = pconnect(host, port, time_out);
      select(3);
      $a -> setex(id, 3);
      echo $a -> get(id);
      //之后執(zhí)行下面的連接
      $b = pconnect(host, port, time_out);
      select(2);
      $b->set(id,2)
      echo $a->get(id);  //這個(gè)id操作的db變成了2,不再是之前的3了。因?yàn)檫@兩個(gè)連接共用了一個(gè)連接通道。

      情況二:?jiǎn)卫J健?/strong>

      將上述的代碼修改,a和b都通過getInstance來生成。生成的前提是判斷當(dāng)前實(shí)例是否存在。單例模式的混淆點(diǎn)在于:

      $a生成了一個(gè)實(shí)例,這時(shí)候生成$b, $b使用了$a的實(shí)例,然后修改了$a的連接,之后調(diào)用$a肯定是調(diào)用的$b修改之后的實(shí)例。跟情況二一致。
      單例模式的代碼如下:

      public static function getInstance($db = 0)
      {
        if (!isset(self::$_instance)) {
          self::$_instance = new Redis();
        }
        self::_connect();
        self::$_instance->select($db);
        return self::$_instance;
      }

      兩種情況都說明了連接重用的問題。如何修復(fù)這個(gè)bug??jī)牲c(diǎn):

      1.為每一個(gè)db生成一個(gè)單例。
      2.避免連接重用問題。

      所以代碼可以做調(diào)整為返回一個(gè)單例數(shù)組:

      public static function getInstance($db = 0)
      {
        try{
          if (isset(self::$_instance[$db]) && self::$_instance[$db]->Ping() == 'Pong') {
            return self::$_instance[$db];
          }
        } catch (Exception $e) {
        }
        self::$_instance[$db] = new Redis();
        self::_connect($db);
        return self::$_instance[$db];
      }

      需要注意的地方

      避免在Task類成員變量中使用redis對(duì)象。

      在redis的單例模式中,聲明了time_out的過期時(shí)間。如果redis處理的場(chǎng)合是一個(gè)任務(wù),而任務(wù)調(diào)用redis間隔時(shí)間又比較長(zhǎng)。當(dāng)間隔大于time_out時(shí)候,redis就會(huì)斷開連接,這時(shí)候所有對(duì)redis的操作都會(huì)失效。解決的辦法就是避免這種調(diào)用方式,通過在調(diào)用的地方動(dòng)態(tài)聲明redis類來執(zhí)行。這種問題對(duì)于長(zhǎng)連接和短鏈接是沒有區(qū)分,屬于調(diào)用的方式錯(cuò)誤。

      以上就是如何在PHP項(xiàng)目中使用Redis長(zhǎng)連接,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


      當(dāng)前名稱:如何在PHP項(xiàng)目中使用Redis長(zhǎng)連接-創(chuàng)新互聯(lián)
      URL地址:http://www.ef60e0e.cn/article/pgdhg.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
        1. <ul id="0c1fb"></ul>

          <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
          <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

          台湾省| 尼玛县| 邵阳县| 星座| 斗六市| 房产| 阳朔县| 阜南县| 武强县| 永泰县| 永安市| 定安县| 巩义市| 潍坊市| 海兴县| 高青县| 周口市| 淮安市| 文山县| 哈尔滨市| 泽普县| 武川县| 宁国市| 富源县| 卓尼县| 灵璧县| 千阳县| 家居| 沂南县| 龙江县| 湘阴县| 乐山市| 边坝县| 盐源县| 措勤县| 夹江县| 娱乐| 廉江市| 桦川县| 锡林浩特市| 拉萨市|