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 session常见问题集锦及解决办法总结
Mar 18 PHP
php一些错误处理的方法与技巧总结
Aug 10 PHP
PHP获取MAC地址的具体实例
Dec 13 PHP
php使用正则过滤js脚本代码实例
May 10 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
微信获取用户地理位置信息的原理与步骤
Nov 12 PHP
php时间计算相关问题小结
May 09 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
Laravel配置全局公共函数的方法步骤
May 09 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 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数据库开发知多少
2006/10/09 PHP
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
2020/11/07 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
浅谈Python基础之I/O模型
2017/05/11 Python
django session完成状态保持的方法
2018/11/27 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
竞选生活委员演讲稿
2014/04/28 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
文明社区申报材料
2014/08/21 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
二审答辩状格式
2015/05/22 职场文书
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python