2013-04-18 52 views
3

遇到一个问题,即对memcached-> get($ key)的调用花费超过30秒,并且引发致命异常。一种奇怪的场景,但基本上,我们拥有的环境有4台服务器运行memcached 0.4,3台服务器运行1.08。Memcached忽略OPT超时

这里的例外

Maximum execution time of 30 seconds exceeded in /docroot/www/library/lib/Core/Cache/Memcache.php on line 152

行号的变化,不同的功能调用内存缓存连接上,但他们总是在无论是replaceget。我已经检查过密钥,并且它们都是字母数字。该文件的

线152

在运行1.08服务器,即时通讯试图设置它,以便那里有3秒对得到的是Timeout(这是比它确实应该是什么更高,但不管)

所以,我写了一个简单的脚本来连接到一些AWS memcache实例,将超时设置为一微秒并尝试让它缓存一个很大的值。

继承人的脚本

$cache = new Memcached(); 
$cache->addServers($servers); 
$cache->setOption(\Memcached::OPT_RECV_TIMEOUT, 1); 
$cache->->setOption(\Memcached::OPT_SEND_TIMEOUT, 5000); 

$key = sha1(microtime(true) . rand(0, 9999999999)); 
$value = sha1($key); 
for($i = 0; $i < 10000; $i++) { 
     $value .= sha1($value); 
} 
$cache->set($key, $value, 120); 
echo "Value Set\n"; 
sleep(5); 
$start = microtime(true); 
var_dump([ 'key' => $key, 'value' => sizeof($cache->get($key)) ]); 
var_dump($cache->getResultMessage()); 
$end = microtime(true); 
echo "Elapsed: " . ($end - $start) . "\n"; 

AND,time php test.php

Value Set 
array(2) { 
    ["key"]=> 
    string(40) "c5c9da5ebef83a24da78cdd8bba61b0fa8473296" 
    ["value"]=> 
    int(1) 
} 
string(7) "SUCCESS" 
Elapsed: 0.0075550079345703 

real 0m14.326s 
user 0m9.129s 
sys 0m0.080s 

任何的输出有任何想法如何解决或者我的问题?帮助非常感谢

+0

所以问题是,它需要超过30秒,并引发异常(该异常的输出是什么?)。这个时间信息与它有什么关系?你只是计时脚本的一部分,很明显这是脚本的一个不同部分需要花费很多时间。 –

+0

时间点是显示它忽略我设置的超时。 (0.007秒> 1微秒),并且它仅在获得。尝试在单个SO帖子中显示两个问题,我猜 – Ascherer

+0

最近发现服务器在不同的时区设置。已经解决了这个问题,并且正在等待第一个问题再次发生。 – Ascherer

回答

2

您是否尝试过使用持久连接?它看起来像您正在使用的服务器池,所以尝试一些简单的像这样:

$poolId = sha1(serialize($servers)); 
$cache = Memcached($poolId); 
if(sizeof($cache->getServerList()) === 0) { 
    $cache->addServers($servers); 
} 

我有一个问题与一些奇怪的行为和随机,很难产生致命错误,并且持久连接已经解决对我来说。发现我的解决方案和代码示例这里:Configuring the PHP Memcached client

认为这可能是问题,因为作者提到:

在大型服务器场中,你要确保你正确配置的连接池。否则,Memcached有一个恶习连接漏洞的坏习惯。

+0

现在就试试这个试试 – Ascherer

+0

诀窍,它看起来像 – Ascherer