关于 PHP memcache 的几个问题

Posted

技术标签:

【中文标题】关于 PHP memcache 的几个问题【英文标题】:A few question about PHP memcache 【发布时间】:2010-11-15 23:03:08 【问题描述】:

1) 我知道我可以这样称呼

$memcache_obj = memcache_connect('memcache_host', 11211);

在我网站的头文件中,对不使用 memcache 的页面没有影响 但是这个呢

$memcache->connect('127.0.0.1', 11211);

应该逐页调用吗?


2) 如果服务器没有足够的内存来写入新的缓存并且 memcache 尝试存储缓存怎么办?


3) 我知道钥匙可以有长达 30 天的使用寿命, 有没有办法将所有键从内存中清除,特别适用于测试阶段?

4) 还有这段代码,第一个变量正在连接,例如,如果我在页面上有 5 个部分从 memcache 添加/更新/删除,我是否需要每次都运行此连接,或者是否可以连接 1 次并做所有事情每页加载?

memcache_set($memcache_obj, 'var_key', 'some variable', 0, 30)

5) 是否有一个函数或任何东西可以显示有多少内存可用并在 php 页面上使用?

【问题讨论】:

【参考方案1】:

    是的,在尝试获取、删除等之前不会进行网络调用,因此在需要时分配对象并没有什么坏处。 (编辑:我在这里想到了“memcached”扩展,结果发现“memcache”扩展确实打开了与 memcache 服务器的连接,尽管命中最多可以忽略不计)

    memcache 将丢弃最少使用的项目以尝试为新对象腾出空间

    $memcache_obj->flush();

    每次脚本运行只需要进行一次连接,最简单的方法是将连接放在页面顶部或类构造器中

    $memcache_obj->getStats() http://www.php.net/manual/en/function.memcache-getstats.php

【讨论】:

非常感谢,你是我在这个问题上看到很多你的帖子的 memcache 人。如果您想看的话,我还在上面添加了 1 个问题【参考方案2】:

Jason 很好地回答了你的问题,但我想我会添加一些注释:

2) 请注意,如果您尝试将超过 1MB(默认)存储到键中,则 memcache 扩展将返回 FALSE 值。如果由于任何原因无法写入密钥,它也会返回 FALSE。

3) 密钥可以拥有 >30 天的生命周期 (TTL)。只需将 TTL 添加到当前时间并将其用作 TTL。使用您的示例调用,它可能是这样的(为清楚起见编码):

$ttl = 60*60*24*60; // 60 days
$newTTL = time()+$ttl;
memcache_set($memcache_obj, 'cache_key', 'some data', 0, $newTTL)

5) 如果您在谈论 PHP 内存,那么 memory_get_usage() 会得到您想要的。 Memcache 内存有点难获得,但使用 getStats() 调用将使您朝着正确的方向前进。

【讨论】:

【参考方案3】:
    http://uk3.php.net/manual/en/function.memcache-connect.php 建议 memcache_connect() 与实例化 Memcache 并在其上调用 connect() 相同 http://code.google.com/p/memcached/wiki/FAQ#What_is_memcached%27s_cache?说“如果服务器内存不足,则首先替换过期的平板,然后再替换最旧的未使用平板。” 重启memcached实例,或者调用flush,这会使服务器上的所有缓存项失效

【讨论】:

以上是关于关于 PHP memcache 的几个问题的主要内容,如果未能解决你的问题,请参考以下文章

nginx+memcached构建页面缓存

windows下安装Memcached服务器,PHP的memcache扩展

windows下XAMPP安装php_memcache扩展

[安全通知] 关于Memcached UDP拒绝服务放大攻击安全预警通知

ruby 使用memcache获取响应。来自https://devcenter.heroku.com/articles/building-a-rails-3-application-with-memc

如何安装最新版本的memcached