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 mail 通过Windows的SMTP发送邮件失败的解决方案
May 27 PHP
PHP 超链接 抓取实现代码
Jun 29 PHP
PHP 柱状图实现代码
Dec 04 PHP
PHP 观察者模式的实现代码
May 10 PHP
ajax返回值中有回车换行、空格的解决方法分享
Oct 24 PHP
php Calender(日历)代码分享
Jan 03 PHP
理解PHP中的stdClass类
Apr 18 PHP
PHP使用glob函数遍历目录或文件夹的方法
Dec 16 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
Jun 06 PHP
php简单实现发送带附件的邮件
Jun 10 PHP
php 数组字符串搜索array_search技巧
Jul 05 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 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采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
日期 时间js控件
2009/05/07 Javascript
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
javascript 二维数组的实现与应用
2010/03/16 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
js模拟微博发布消息
2017/02/23 Javascript
js中null与空字符串""的区别讲解
2019/01/17 Javascript
js+canvas实现纸牌游戏
2020/03/16 Javascript
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
numpy排序与集合运算用法示例
2017/12/15 Python
Python爬豆瓣电影实例
2018/02/23 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
Python pandas用法最全整理
2019/08/04 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
德国PC硬件网站:CASEKING
2016/10/20 全球购物
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
社区工作者先进事迹
2014/01/18 职场文书
求职意向书
2014/04/01 职场文书
建筑工程质量通病防治方案
2014/06/08 职场文书
2014年学习部工作总结
2014/11/12 职场文书
感动中国何玥观后感
2015/06/02 职场文书
长征观后感
2015/06/09 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
索尼ICF-5900W收音机测评
2022/04/24 无线电