【问题标题】:How does addServer method of PHP Memcache/Memcached work?PHP Memcache/Memcached 的 addServer 方法是如何工作的?
【发布时间】:2018-11-24 17:41:19
【问题描述】:

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

我想通过memcached hereaddServer方法和用户部分的第二条评论是这样的:

重要的是不要在每次运行时调用 ->addServers() - 仅在不存在服务器时调用它(检查 getServerList() );否则,由于 addServers() 不检查 dups,它会让你一次又一次地添加相同的服务器,从而导致数百甚至数千个连接到 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 脚本等。我似乎无法弄清楚如何做到这一点。)

【问题讨论】:

  • 鉴于它是用户评论而不是官方手动条目,并且很难协调 PHP 实例之间保留的任何隐式状态,我会对此持保留态度。

标签: php memcached php-5.6 libmemcached


【解决方案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());
?>

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2012-03-25
    • 2011-12-01
    • 2012-11-20
    相关资源
    最近更新 更多