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中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 PHP
自定义php类(查找/修改)xml文档
Mar 26 PHP
php异常处理使用示例
Feb 25 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
Oct 30 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
PHP设计模式之工厂模式与单例模式
Sep 28 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
Aug 02 PHP
PHP环形链表实现方法示例
Sep 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
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
js实现特定位取反原理及示例
2014/06/30 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
jquery实现清新实用的网页菜单效果
2015/08/28 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
2016/09/01 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
2014年秋季开学典礼主持词
2014/08/02 职场文书
科技工作者先进事迹
2014/08/16 职场文书
公务员检讨书
2014/11/01 职场文书
投标承诺函范文
2015/01/21 职场文书
升学宴家长答谢词
2015/09/29 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js