欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP使用Redis長連接的方法詳解

 更新時間:2018年02月12日 09:09:30   作者:發(fā)飆的小蝸牛  
這篇文章主要介紹了PHP使用Redis長連接的方法,結(jié)合實例形式詳細(xì)分析php操作redis長連接的使用方法及相關(guān)注意事項,需要的朋友可以參考下

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

php-redis在github上的項目地址:https://github.com/phpredis/phpredis

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秒的過期時間。將是不同于上面的新連接
$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使用介紹

對pconnect方法簡單描述

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

[待驗證]如果使用的是長連接,Redis配置文件中的timeout配置項需要設(shè)置為0,否則連接池中的連接會因為超時而失效

針對PHP-FPM來說明一下pconnect

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

關(guān)閉長連接

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

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

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

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

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

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

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

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

情況一:非單例模式。

說明:a實例和b實例共用了一條連接,b實例將a實例的連接修改了:
所以下面的例子導(dǎo)致最終$a實例得到的值變成了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);  //這個id操作的db變成了2,不再是之前的3了。因為這兩個連接共用了一個連接通道。

情況二:單例模式。

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

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

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

兩種情況都說明了連接重用的問題。如何修復(fù)這個bug?兩點:

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

所以代碼可以做調(diào)整為返回一個單例數(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對象。

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

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php+redis數(shù)據(jù)庫程序設(shè)計技巧總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP基本語法入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

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

相關(guān)文章

  • 一個基于PDO的數(shù)據(jù)庫操作類(新) 一個PDO事務(wù)實例

    一個基于PDO的數(shù)據(jù)庫操作類(新) 一個PDO事務(wù)實例

    原先已經(jīng)寫過一個PDO的數(shù)據(jù)庫操作類,這次只是在原先基礎(chǔ)上進(jìn)行修改。
    2011-07-07
  • PHP實現(xiàn)簡單實用的驗證碼類

    PHP實現(xiàn)簡單實用的驗證碼類

    這篇文章主要介紹了PHP實現(xiàn)簡單實用的驗證碼類,包含驗證碼常用的隨機(jī)驗證碼、干擾線、圖片生成與輸出等相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • php中CI操作多個數(shù)據(jù)庫的代碼

    php中CI操作多個數(shù)據(jù)庫的代碼

    最近有個需求,做一個獨立后臺出來,這個獨立后臺有單獨的庫,單獨的url,單獨…。但是,這里邊只是一些基礎(chǔ)數(shù)據(jù),而使用者需要通過該庫查看另一個庫里的統(tǒng)計數(shù)據(jù)。這就帶來一個問題:我需要在控制器里邊可以同時操作兩個數(shù)據(jù)庫,而且這兩個庫毫不相干
    2012-07-07
  • php性能優(yōu)化進(jìn)階不要在for循環(huán)中操作DB

    php性能優(yōu)化進(jìn)階不要在for循環(huán)中操作DB

    這篇文章主要為大家介紹了php性能優(yōu)化進(jìn)階不要在for循環(huán)中操作DB,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • php smarty模板引擎的6個小技巧

    php smarty模板引擎的6個小技巧

    php smarty模板引擎中幾個經(jīng)常被忽略的但比較有用的標(biāo)簽整理,包括capture標(biāo)簽,config_load標(biāo)簽,php標(biāo)簽,strip標(biāo)簽,fetch標(biāo)簽,以及如何在smarty模板中直接使用define定義的常量
    2014-04-04
  • 簡單談?wù)刾hp中ob_flush和flush的區(qū)別

    簡單談?wù)刾hp中ob_flush和flush的區(qū)別

    本文簡單的對php中ob_flush和flush進(jìn)行了對比分析,得出了他們之間的區(qū)別,給需要的小伙伴參考下。
    2014-11-11
  • PHP操作Mongodb封裝類完整實例

    PHP操作Mongodb封裝類完整實例

    這篇文章主要介紹了PHP操作Mongodb封裝類,結(jié)合完整實例形式分析了php封裝的針對MongoDB數(shù)據(jù)庫常見的基本配置、連接、增刪改查、集合等操作定義與使用方法,需要的朋友可以參考下
    2018-06-06
  • PHP pthread拓展使用和注意點

    PHP pthread拓展使用和注意點

    這篇文章主要介紹了PHP pthread拓展使用和注意點,對此有需要的朋友們可以參考閱讀下。
    2020-01-01
  • php的memcached客戶端memcached

    php的memcached客戶端memcached

    之前在安裝memcache時有提到memcached客戶端是叫memcache,其實還有一個基于libmemcached的客戶端叫memcached,據(jù)說性能更好,功能也更多。
    2011-06-06
  • 淺析PHP中的UNICODE 編碼與解碼

    淺析PHP中的UNICODE 編碼與解碼

    本篇文章是對PHP中的UNICODE 編碼與解碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06

最新評論