PHP扩展模块memcached长连接使用方法分析


Posted in PHP onDecember 24, 2014

      网上广泛流传着一篇文章,讲述php的两个扩展模块memcache和memcached的区别,其中特意强调了memcached与memcached一个很大的区别是memcached模块不支持长连接。以至于后来很多年我都认为memcached是不支持长连接的,其实不然,memcached扩展模块从很早的版本开始就已经支持长连接了。从扩展模块的源码注视中我们就能看到:

/* {{{ Memcached::__construct([string persistent_id[, callback on_new[, string connection_str]]]))

   Creates a Memcached object, optionally using persistent memcache connection */

static PHP_METHOD(Memcached, __construct)

{

从php的手册身上我们可以看到memcached的扩展模块提供的构造函数提供一个参数persistent_id可选项,手册中这样介绍:

      默认情况下,Memcached实例在请求结束后会被销毁。但可以在创建时通过persistent_id为每个实例指定唯一的ID, 在请求间共享实例。所有通过相同的persistent_id值创建的实例共享同一个连接。 

这个参数的含义就是说如果你传递了一个命名id给到构造方法,那么就会建立长连接,通常我们使用的都是PHP-FPM模式,这样PHP-FPM进程就会和memcached服务简历一条长连接通道。我们也可以理解为persistent_id就是一个连接池名字,所有php-fpm进程都是这个连接池中的一员。

     但我们需要注意的是php是解释性语言,当php第一次通过memached模块建立起长连接后,切记后续的php执行就不要再通过memcached的构造函数构建相同persistent_id命名的长连接,可以建立不同persistent_id名字的长连接,如果是相同的名字被php重复执行,一定会导致php-fpm的进程异常导致与memcached的通信越来越慢,同时根据libmemcached的版本不同还会导致php产生coredump。

    那么我们如何避免单个php-fpm在建立完以persistent_id命名的长连接后不再重复建立长连接呢?其实在PHP带有评注的手册上是有讲解的,内容如下:

When using persistent connections, it is important to not re-add servers.

This is what you do not want to do:

$mc = new Memcached('mc');
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$mc->addServers(array(
  array('mc1.example.com',11211),
  array('mc2.example.com',11211),
));

Every time the page is loaded those servers will be appended to the list resulting in many simultaneous open connections to the same server. The addServer/addServers functions to not check for existing references to the specified servers.

A better approach is something like:

$mc = new Memcached('mc');
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
if (!count($mc->getServerList())) {
  $mc->addServers(array(
    array('mc1.example.com',11211),
    array('mc2.example.com',11211),
  ));
}

通过使用getServerList()方法来检查当前执行使用的php-fpm进程容器中是否已经存在相同名字的长连接资源,如果存在就不要重复使用addServers() 方法来新增长连接配置。

PHP 相关文章推荐
PHP中替换换行符的几种方法小结
Oct 15 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
destoon利用Rewrite规则设置网站安全
Jun 21 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
Aug 20 PHP
跟我学Laravel之快速入门
Oct 15 PHP
php数组操作之键名比较与差集、交集赋值的方法
Nov 10 PHP
PHP对文件夹递归执行chmod命令的方法
Jun 19 PHP
PHP实现根据图片色界在不同位置加水印的方法
Aug 08 PHP
yii数据库的查询方法
Dec 28 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
Zend Framework上传文件重命名的实现方法
Nov 25 PHP
PHP实现的观察者模式实例
Jun 21 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 #PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 #PHP
php将access数据库转换到mysql数据库的方法
Dec 24 #PHP
php启用sphinx全文搜索的实现方法
Dec 24 #PHP
php中mail函数发送邮件失败的解决方法
Dec 24 #PHP
微信公众平台接口开发入门示例
Dec 24 #PHP
PHP获取youku视频真实flv文件地址的方法
Dec 23 #PHP
You might like
php adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
jquery ready()的几种实现方法小结
2010/06/18 Javascript
2010年最佳jQuery插件整理
2010/12/06 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现桌面气泡提示功能
2019/07/29 Python
python爬虫 urllib模块发起post请求过程解析
2019/08/20 Python
python类中super() 的使用解析
2019/12/19 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
Hibernate持久层技术
2013/12/16 面试题
运动会邀请函范文
2014/02/06 职场文书
幼儿园大班教学反思
2014/02/10 职场文书
《阳光》教学反思
2014/02/23 职场文书
就业推荐表自我鉴定
2014/03/21 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
继续教育个人总结
2015/03/03 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电
golang生成vcf通讯录格式文件详情
2022/03/25 Golang