pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

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

這篇文章主要介紹了PHP使用Redis長連接的方法,結(jié)合實例形式詳細分析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)

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

$redis->pconnect('127.0.0.1', 6379);
$redis->pconnect('127.0.0.1'); // 默認端口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)閉,只有在進程結(jié)束之后該連接才會被關(guān)閉。

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

針對PHP-FPM來說明一下pconnect

長連接只會在PHP-FPM進程結(jié)束之后結(jié)束,連接的生命周期就是PHP-FPM進程的生命周期。
相比較短連接而言,在每一個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的作用僅僅是使當前PHP進程不能再進行redis請求,但無法真正關(guān)閉redis長連接,連接在后續(xù)請求中仍然會被重用,直FPM進程生命周期結(jié)束。所以close 并不會銷毀redis對象,只是斷開連接而已。

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

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

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

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

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

代碼分析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來生成。生成的前提是判斷當前實例是否存在。單例模式的混淆點在于:

$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對象。

【網(wǎng)站聲明】本站除付費源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請勿用于商業(yè)用途。如損害你的權(quán)益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結(jié)合實例形式分析了php實現(xiàn)針對有序表插值查找的相關(guān)操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現(xiàn)服務(wù)端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現(xiàn)APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現(xiàn)的多維數(shù)組排序算法,結(jié)合實例形式對比分析了php針對多維數(shù)組及帶有鍵名的多維數(shù)組進行排序相關(guān)操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結(jié)合ajaxuploadfile實現(xiàn)無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發(fā)接口使用RSA進行加密解密方法,對此有興趣的朋友可以學(xué)習(xí)下。
主站蜘蛛池模板: 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 高压绝缘垫-红色配电房绝缘垫-绿色高压绝缘地毯-上海苏海电气 | 电池挤压试验机-自行车喷淋-车辆碾压试验装置-深圳德迈盛测控设备有限公司 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 物流公司电话|附近物流公司电话上门取货| 首页-瓜尔胶系列-化工单体系列-油田压裂助剂-瓜尔胶厂家-山东广浦生物科技有限公司 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 明渠式紫外线杀菌器-紫外线消毒器厂家-定州市优威环保 | 威海防火彩钢板,威海岩棉复合板,威海彩钢瓦-文登区九龙岩棉复合板厂 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 球磨机 选矿球磨机 棒磨机 浮选机 分级机 选矿设备厂家 | 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | Win10系统下载_32位/64位系统/专业版/纯净版下载 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 金联宇电缆总代理-金联宇集团-广东金联宇电缆实业有限公司 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 蜜蜂职场文库_职场求职面试实用的范文资料大全 | 丝印油墨_水性油墨_环保油墨油漆厂家_37国际化工 | 泰安塞纳春天装饰公司【网站】 | 施工围挡-施工PVC围挡-工程围挡-深圳市旭东钢构技术开发有限公司 | 电机修理_二手电机专家-河北豫通机电设备有限公司(原石家庄冀华高压电机维修中心) | 浙江工业冷却塔-菱电冷却塔厂家 - 浙江菱电冷却设备有限公司 | 拉力机-拉力试验机-万能试验机-电子拉力机-拉伸试验机-剥离强度试验机-苏州皖仪实验仪器有限公司 | 隧道风机_DWEX边墙风机_SDS射流风机-绍兴市上虞科瑞风机有限公司 | 首页-恒温恒湿试验箱_恒温恒湿箱_高低温试验箱_高低温交变湿热试验箱_苏州正合 | 无压烧结银_有压烧结银_导电银胶_导电油墨_导电胶-善仁(浙江)新材料 | 机床主轴维修|刀塔维修|C轴维修-常州翔高精密机械有限公司 | 玻纤土工格栅_钢塑格栅_PP焊接_单双向塑料土工格栅_复合防裂布厂家_山东大庚工程材料科技有限公司 | 房间温控器|LonWorks|海思 | 聚氨酯复合板保温板厂家_廊坊华宇创新科技有限公司 | 油液红外光谱仪-油液监测系统-燃油嗅探仪-上海冉超光电科技有限公司 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 英超直播_英超免费在线高清直播_英超视频在线观看无插件-24直播网 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 乳化沥青设备_改性沥青设备_沥青加温罐_德州市昊通路桥工程有限公司 | 巨野月嫂-家政公司-巨野县红墙安康母婴护理中心 |