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 相关文章推荐
第五节--克隆
Nov 16 PHP
php mysql数据库操作类
Jun 04 PHP
探讨:使用XMLSerialize 序列化与反序列化
Jun 08 PHP
php字符编码转换之gb2312转为utf8
Oct 28 PHP
ThinkPHP令牌验证实例
Jun 18 PHP
PHP获取ip对应地区和使用网络类型的方法
Mar 11 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
Oct 27 PHP
CI框架入门之MVC简单示例
Nov 21 PHP
php实现微信企业号支付个人的方法详解
Jul 26 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
Apr 16 PHP
Laravel5框架自定义错误页面配置操作示例
Apr 17 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
Oct 12 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
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
php 使用array函数实现分页
2015/02/13 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
js实现表格字段排序
2014/02/19 Javascript
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
JavaScript如何判断input数据类型
2020/02/06 Javascript
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
对python实时得到鼠标位置的示例讲解
2018/10/14 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
python获取linux系统信息的三种方法
2020/10/14 Python
Python修改DBF文件指定列
2020/12/19 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
营销主管自我评价怎么写
2013/09/19 职场文书
小学社会实践活动总结
2014/07/03 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
家属慰问信
2015/02/14 职场文书
社区安置帮教工作总结2015
2015/05/20 职场文书
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python