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 09 PHP
文章推荐系统(二)
Oct 09 PHP
PHP HTML代码串截取代码
Dec 29 PHP
PHP 输出简单动态WAP页面
Jun 09 PHP
PHP 冒泡排序算法的实现代码
Aug 08 PHP
谷歌音乐搜索栏的提示功能php修正代码
May 09 PHP
Codeigniter生成Excel文档的简单方法
Jun 12 PHP
php输出xml属性的方法
Mar 19 PHP
php修改文件上传限制方法汇总
Apr 07 PHP
PHP输出缓冲控制Output Control系列函数详解
Jul 02 PHP
Zend Framework入门教程之Zend_Mail用法示例
Dec 08 PHP
php获取是星期几的的一些常用姿势
Dec 15 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中使用Oracle数据库(2)
2006/10/09 PHP
php中mt_rand()随机数函数用法
2014/11/24 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
jQuery对象的selector属性用法实例
2014/12/27 Javascript
简介JavaScript中的italics()方法的使用
2015/06/08 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
2016/05/31 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
Three.js实现浏览器变动时进行自适应的方法
2017/09/26 Javascript
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
2018/01/23 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
python连接mysql并提交mysql事务示例
2014/03/05 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
Python图片的横坐标汉字实例
2019/12/04 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
python excel多行合并的方法
2020/12/09 Python
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
2014年教师培训的自我评价
2014/01/03 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
高中生逃课检讨书
2014/10/10 职场文书
初中家长评语和期望
2014/12/26 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript