3

memcached->get( $key ) の呼び出しに 30 秒以上かかり、致命的な例外がスローされるという問題があります。ちょっと奇妙なシナリオですが、基本的に、私たちが持っている環境には、memcached 0.4 を実行している 4 つのサーバーと 1.08 を実行している 3 つのサーバーがあります。

ここに例外があります

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

行番号は、memcache 接続で呼び出すさまざまな関数に変更されますが、常に areplaceまたは a のいずれかにありgetます。キーを確認しましたが、すべて英数字です。

そのファイルの152行目は

1.08 を実行しているサーバーでは、取得時に 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

私の問題のいずれかを解決する方法を知っている人はいますか? ヘルプは大歓迎です

4

1 に答える 1

2

永続的な接続を使用してみましたか? サーバー プールを使用しているようです。次のような簡単なことを試してください。

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

いくつかの奇妙な動作とランダムで致命的なエラーを生成するのが難しいという問題があり、持続的な接続がそれを解決してくれました。ここで私のソリューションとコード例を見つけました: PHP Memcached クライアントの構成

著者が言及しているように、これが問題かもしれないと考えてください:

大規模なサーバー ファームでは、接続プールを適切に構成する必要があります。そうしないと、Memcached には接続を喜んでリークするという悪い癖があります。

于 2013-04-23T17:47:54.440 に答える