关于 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 的几个问题的主要内容,如果未能解决你的问题,请参考以下文章
windows下安装Memcached服务器,PHP的memcache扩展
[安全通知] 关于Memcached UDP拒绝服务放大攻击安全预警通知
ruby 使用memcache获取响应。来自https://devcenter.heroku.com/articles/building-a-rails-3-application-with-memc