PHP中的基本Memcache问题

时间:2012-02-03 17:34:52

标签: php class memcached

我以前从未使用过memcache所以请原谅我的经验不足。虽然它非常自我解释,但我想确保我正确使用内置函数,因为我正在创建一个将在商业上使用的类,因此它必须正确编码并且有效。

我有几个问题,但由于它们非常基本,我觉得将它们组合成一个Stackoverflow问题是可以的。

如果他们需要一篇论文答案,请不要打扰,我会将其作为一个单独的问题发布

  1. 我何时需要使用memcache::addServer,这与memcache::connect之间有什么区别?
  2. 如果内存耗尽,memcache是​​否会覆盖存储的值,即使该项目尚未过期?
  3. 我将memcache::getExtendedStats用于什么?
  4. 如何查看是否已存在与memcache的连接,如果没有,请创建连接?
  5. 如果我设置了'localhost'的常用memcache服务器,我将如何在同一个专用服务器上设置另一个memcache服务器?
  6. 除了更多的内存,拥有多个memcache服务器有什么好处?
  7. 我应该定期检查内存缓存服务器更新吗?
  8. 在每个页面的开头使用大量内存来运行memcache :: connect,即使我没有使用它吗?
  9. 我什么时候可能会返回错误,我该如何捕捉这些?
  10. 最重要的是,如果我在另一个类中使用memcache,其中有多个方法可以在每个脚本中调用一次以上,那么我应该如何在每个方法中初始化对象并连接到服务器?
  11. 我对最后一个问题的猜测是这样做的:

    class test {
         public function blah(){
              // Make sure the memcache object is accessible
              global $memcache;
    
              // Do something ...
              // Save result in memcache
              $memcache->set(...);
         }
         public function foo(){
              // Do something ...
              // No use for memcache
         }
    }
    
    // Initialise each class
    $test = new test;
    $memcache = new memcache;
    $memcache->connect(...);
    
    // Call some methods from the test class
    $test->blah();
    $test->foo();
    $test->blah();
    

    正如您在上面的示例中所看到的,我在脚本开头连接到memcache服务器。如果我要在每个页面的开头包含它,即使在不使用memcache的页面上,这会增加响应时间很多还是最小量? 因此,问题8!

1 个答案:

答案 0 :(得分:23)

在阅读本文之前,您可能需要一些咖啡或其他东西:

  1. 当您需要添加更多Memcached服务器时,您需要使用Memcache::addServer。例如,如果您有一个非常繁忙的网站或Web应用程序...您可能希望有多个Memcached服务器运行 1 。如果要启动与其中一个Memcached服务器的连接,则使用Memcache::connect。另外,根据Memcache::addServer文档,Memcache::addServerMemcache::connect之间的另一个区别是Memcache::addServer,在实际需要 2

  2. 如果Memcached耗尽RAM,它将丢弃最旧的值 3

  3. Memcache::getExtendedStats用于检查有关Memcached服务器的信息。例如,如果您需要了解服务器已运行多长时间(正常运行时间),服务器连接的数量,或一般服务器使用情况 4 ,这是一个很棒的工具。

  4. 检查与Memcached的连接是否已存在的最简单方法可能是检查$ memcache连接变量,看它是否返回TRUE 5 。如果您需要持久连接(即使在脚本结束后仍然继续),可以选择使用Memcache::pconnect 6

  5. 如果你想让两个Memcached服务器继续运行......而你的第一台服务器已经是你的本地主机,你很可能需要为第二个 7

  6. 拥有多个Memcached服务器的至少另一个好处是,即使一台服务器发生故障,每当您使数据(或服务器)多样化时......您仍然有许多其他服务器把碎片捡起来。 Memcached看起来像 8 ,就像它分布在你运行的许多服务器上......所以如果服务器出现故障,你仍然会丢失那部分缓存。但是,您仍然可以启动并运行其他服务器以帮助继续运行。

  7. 一般来说,保持几乎任何类型的软件都是最新的并不是一个坏主意。看起来Memcached仍然是一个高度活跃的项目 9 ,所以你可能想要尽可能地更新它。但是Memcached的本质似乎并没有在过去的版本中发生很大变化......因此,与操作系统软件相比,更新它可能并不那么重要。

  8. 这听起来就像Memcached为TCP连接分配内存的方式(当你通过Memcache::connect调用Memcached服务器时),最终会花费你的内存 10 。如果您确定在某些页面上不需要该连接,则可能需要避免进行该连接呼叫。

  9. 很难说出代码中可能出现的错误类型。但是,使用像Memcached这样的东西,当你的内存不足时,你可能会发现错误 11

  10. 与问题8的答案一样,我仍然建议您只尝试在您绝对需要的地方调用$memcache->connect()。您可能在许多应用程序或脚本中使用Memcached;但是可能还有一些地方你不需要它。

  11. 就问题10的代码构思而言,就实现而言,这完全取决于你。一般来说,尽可能避免全局变量 12 是件好事。相反,就像脚注中的文章(12)所说的那样,更容易使用单例类调用进行连接......然后每次想要建立连接时都调用它。

    哇,我的眼睛累了。我希望这有帮助,伙计......!

    1 http://en.wikipedia.org/wiki/Memcached(参阅架构部分)

    2 http://www.php.net/manual/en/memcache.addserver.php

    3 http://en.wikipedia.org/wiki/Memcached(参见架构部分)

    4 http://www.php.net/manual/en/memcache.getextendedstats.php

    5 http://www.php.net/manual/en/memcache.connect.php(参见返回值部分)

    6 http://www.php.net/manual/en/memcache.pconnect.php

    7 http://www.php.net/manual/en/memcache.addserver.php#101194

    8 Benefits of multiple memcached instances

    9 http://code.google.com/p/memcached/

    10 http://www.facebook.com/note.php?note_id=39391378919(来自Facebook的观点)

    11 http://groups.google.com/group/memcached/browse_thread/thread/9ce1e2691efb283b

    12 How to avoid using PHP global objects?