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的安全策略
Oct 09 PHP
无数据库的详细域名查询程序PHP版(4)
Oct 09 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
Aug 21 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 PHP
php实现图片文件与下载文件防盗链的方法
Nov 03 PHP
php读取txt文件并将数据插入到数据库
Feb 23 PHP
PHP实现的网站目录扫描索引工具
Sep 08 PHP
php 防止表单重复提交两种实现方法
Nov 03 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 PHP
PHP数组常用函数实例小结
Aug 20 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调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
php DES加密算法实例分析
2019/09/18 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
js获取form的方法
2015/05/06 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
2019/04/11 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
Python能做什么
2020/06/02 Python
浅析Python requests 模块
2020/10/09 Python
python requests库的使用
2021/01/06 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
大学生的网络创业计划书
2013/12/26 职场文书
11月红领巾广播稿
2014/01/17 职场文书
捐款倡议书范文
2014/02/02 职场文书
《鲁班和橹板》教学反思
2014/04/27 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
工作失职自我检讨书
2015/05/05 职场文书
硕士论文致谢范文
2015/05/14 职场文书
学风建设主题班会
2015/08/17 职场文书