2

我目前在 Apache 服务器上运行PHP Memcache 。由于 Memcache 和Memcached具有相似的内部工作原理,所以这个问题是关于它们的。

我想知道这里addServer的 memcached 方法,用户部分的第二条评论是这样的:

重要的是不要在每次运行时调用 ->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 脚本等。我似乎无法弄清楚如何做到这一点。)
4

1 回答 1

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());
?>
于 2018-11-29T08:40:56.940 回答