Memcached忽略OPT超时

时间:2013-04-18 23:52:27

标签: php memcached

有一个问题,调用memcached-> get($ key)需要超过30秒,并且会抛出一个致命的异常。有点奇怪的情况,但基本上,我们拥有的环境有4个服务器运行memcached 0.4,3个服务器运行1.08。

这是例外

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

行号更改,调用memcache连接的不同函数,但它们始终位于replaceget上。我检查了密钥,它们都是字母数字。

该文件的第152行是

在运行1.08的服务器上,即时尝试将其设置为一个get的超时时间为3秒(这比实际应该高,但无论如何)

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

继承剧本

$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

任何人都知道如何解决我的任何一个问题?非常感谢帮助

1 个答案:

答案 0 :(得分:2)

您是否尝试过使用持久连接?看起来您正在使用服务器池,因此请尝试这样简单的事情:

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

我遇到了一些奇怪的行为和随机的问题,很难产生致命的错误,持久的连接已经解决了它。在此处找到我的解决方案和代码示例:Configuring the PHP Memcached client

认为这可能是问题,正如作者提到的那样:

  

在大型服务器场中,您需要确保正确配置连接池。否则,Memcached就有一种习惯,就是快乐地泄露连接。