PHP扩展模块memcached长连接使用方法分析_php技巧

      网上广泛流传着一篇文章,讲述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() 方法来新增长连接配置。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索长连接
memcached
php memcached 扩展、php安装memcached扩展、php7 memcached扩展、memcached扩展、memcached扩展安装,以便于您获取更多的相关知识。

时间: 2024-10-31 00:03:23

PHP扩展模块memcached长连接使用方法分析_php技巧的相关文章

PHP set_time_limit(0)长连接的实现分析_php技巧

每个PHP脚本都限制了执行时间,所以我们需要通过 set_time_limit 来设置一个脚本的执行时间为无限长:然后使用 flush() 和 ob_flush() 来清除服务器缓冲区,随时输出脚本的返回值. 如下面这段脚本: 复制代码 代码如下: <?php header("Content-Type: text/plain"); set_time_limit(0); $infoString = "Hello World" . "\n";

PHP连接MSSQL方法汇总_php技巧

 为了能让PHP连接MSSQL,系统需要安装MSSQL,PHP,且在PHP.ini中的配置中,将 ;extension=php_mssql.dll前面的;去掉 1.连接MSSQL $conn=mssql_connect("实例名或者服务器IP","用户名","密码"); //测试连接 if($conn) { echo "连接成功"; } 2.选择要连接的数据库       mssql_select_db("dbnam

关于PHP文件的自动运行方法分析_php技巧

本文实例分析了PHP文件的自动运行方法.分享给大家供大家参考,具体如下: 这里分析两种方法: 第一种方法: a.php文件内容 如下: <?php ini_set("error_log", "c:\php\php_error.log"); error_log("a.php is execute----------",0); ignore_user_abort(); // 后台无阻断运行 set_time_limit(0); // 一直给我运

PHP入门教程之PHP操作MySQL的方法分析_php技巧

本文实例讲述了PHP操作MySQL的方法.分享给大家供大家参考,具体如下: 设置Zend 软件所有 UTF-8 编码 设置单个项目 UTF-8 的编码 Demo1.php <?php header('Content-Type:text/html; charset=utf-8;'); //第一步,连接到 Mysql 服务器 3306 //第二步参数,服务器地址:第二个参数,服务器的用户名:第三个参数,服务器密码 //@ 如果出错了,不要出现警告或错误,直接忽略 //die 函数之前,先连接一下,报

PHP利用hash冲突漏洞进行DDoS攻击的方法分析_php技巧

本文实例分析了PHP利用hash冲突漏洞进行DDoS攻击的方法.分享给大家供大家参考.具体分析如下: 首先声明:本文内容只用于研究学习使用,请勿用于非法行为! 前面提到过最近爆出的hash表碰撞漏洞,包括java.python.php等在内的很多常用语言均未幸免,今晚咱就来实际看看它的威力. 攻击原理: 通过向目标服务器post一组精心拼凑的数组参数,到达服务端后语言底层处理接收到的数组参数时,由于该漏洞的存在造成CPU的大量消耗,最终导致服务器资源耗尽. 不用什么花哨的手法,就用PHP简单实现

php通过记录IP来防止表单重复提交方法分析_php技巧

本文实例分析了php通过记录IP来防止表单重复提交方法.分享给大家供大家参考.具体分析如下: 这个原理比较的简单就是用户第一次提交时我们记录提交用户的IP地址,这样如果用户在固定时间内再次提交表单就会提示重复提交了,这种做法通常用于在顶一下,支持一下这种应用中了,在防止数据重复提交是一个非常不好的选择. 例子,代码如下: 复制代码 代码如下: <?php session_start(); if(empty($_SESSION['ip']))//第一次写入操作,判断是否记录了IP地址,以此知道是否

php模拟登陆的实现方法分析_php技巧

本文实例分析了php模拟登陆的实现方法.分享给大家供大家参考.具体分析如下: php模拟登陆的实现方法,这里分别列举两种方法实现模拟登陆人人网.具体实例代码如下: 1)使用snoopy模拟登陆: 复制代码 代码如下: <?php set_time_limit(0); require "Snoopy.class.php"; $snoopy=new Snoopy(); $snoopy->referer='http://www.jb51.net/'; $snoopy->ag

php文件下载处理方法分析_php技巧

本文实例讲述了php文件下载的处理方法.分享给大家供大家参考.具体分析如下: php能够处理多种条件的文件下载,先来看下面示例: <?php header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=testname.jpg"); readfile("images/test.jpg"); ?>

mongo Table类文件 获取MongoCursor(游标)的实现方法分析_php技巧

MongoCursor Object 游标类 MongoConfig.php配置文件Table.php(mongodb操作数据库类文件) Config.php配置文件 复制代码 代码如下: <?phprequire_once 'Zend/Exception.php';class Hrs_Mongo_Config{    const VERSION = '1.7.0';    const DEFAULT_HOST = 'localhost';    const DEFAULT_PORT = 270