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在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
PHP的面试题集
Nov 19 PHP
PHP网站基础优化方法小结
Sep 29 PHP
PHP内核介绍及扩展开发指南―基础知识
Sep 11 PHP
php下利用curl判断远程文件是否存在的实现代码
Oct 08 PHP
input file获得文件根目录简单实现
Apr 26 PHP
php ci框架中加载css和js文件失败的原因及解决方法
Jul 29 PHP
php使用explode()函数将字符串拆分成数组的方法
Feb 17 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
Mar 21 PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
Apr 15 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
Oct 25 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
深入了解php4(1)--回到未来
2006/10/09 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
php常用字符串比较函数实例汇总
2014/11/24 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
2015/10/16 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
vue小白入门教程
2018/04/02 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
Vuejs中的watch实例详解(监听者)
2020/01/05 Javascript
python标准算法实现数组全排列的方法
2015/03/17 Python
python2.7的编码问题与解决方法
2016/10/04 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
python实现傅里叶级数展开的实现
2018/07/21 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
python 贪心算法的实现
2020/09/18 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
护理专业的自荐信
2013/10/22 职场文书
企业项目策划书
2014/01/11 职场文书
个人自我剖析材料
2014/02/07 职场文书
我的求职择业计划书
2014/04/04 职场文书
综合内勤岗位职责
2014/04/14 职场文书
幼儿园运动会口号
2014/06/07 职场文书
贷款委托书怎么写
2014/08/02 职场文书
走进科学观后感
2015/06/18 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android