PHP Memcache / Memcached的addServer方法如何工作?

时间:2018-11-24 17:41:20

标签: php memcached php-5.6 libmemcached

我当前在Apache服务器上运行PHP Memcache。由于Memcache和Memcached具有相似的内部工作原理,因此这个问题与他们两个有关。

我想知道通过memcached hereaddServer方法,用户部分的第二个注释是:

  

对于每次运行不调用-> addServers()很重要-仅在不存在服务器的情况下调用它(请检查getServerList());否则,由于addServers()不检查重复项,因此它将允许您一次又一次地添加同一服务器,从而导致与MC守护程序的数百个(甚至数千个)连接。特别是在使用FastCGI时。

不清楚“每次运行” 是什么意思。这是否意味着由不同的用户/远程客户端多次在脚本中调用addServer 或在多个请求中调用?因为考虑以下脚本:

<?php
    $memcache_obj = new \Memcache;
    //$memcache_obj->connect('localhost', 11211); --> each time new connection, not recommended
    $memcache_obj->addServer('localhost', 11211,true,1,1,15,true,function($hostname,$port){
        //echo("There was a problem with {$hostname} at {$port}");
        die;
    });
    print_r($memcache_obj->getExtendedStats());
?>

如果作为客户端,我对上述脚本发出了xmlhttp请求,我将得到以下内容:

Array
(
    [localhost:11211] => Array
        (
            [pid] => 12308
            [uptime] => 3054538123
            ....

到目前为止,如果我取消对addServer部分的注释并按以下方式执行:

<?php
    $memcache_obj = new \Memcache;
    print_r($memcache_obj->getExtendedStats());
?>

然后我得到了:

<br />
<b>Warning</b>:  MemcachePool::getserverstatus(): No servers added to 
memcache connection in <b>path/to/php</b> on line <b>someLineNumber</b><br />

因此,当远程客户端调用php脚本时,显然至少必须添加服务器。 那么以下哪一项是正确的:

  • 我们应注意不要在同一PHP脚本中多次调用`addServer``。 (我倾向于这样理解)
  • 我们应该小心,不要在多个请求中调用addServer (例如2个用户正在调用相同的php脚本等。我似乎无法弄清楚该怎么做。)

1 个答案:

答案 0 :(得分:1)

您确实必须添加服务器一次,否则您将收到此错误。正如评论所建议的那样,您应该使用getServerList()来检查是否已经添加了服务器,如果不存在则添加它们:

<?php
    $memcache_obj = new \Memcache;
    //$memcache_obj->connect('localhost', 11211); --> each time new connection, not recommended
    if (!memcache_obj->getServerList()){
        $memcache_obj->addServer('localhost', 11211,true,1,1,15,true,function($hostname,$port){
            //echo("There was a problem with {$hostname} at {$port}");
            die;
        });
    }
    print_r($memcache_obj->getExtendedStats());
?>