6

PHP memcache クライアントと memcached サーバーの間で実際の永続性を有効にするために、さまざまな memcached ライブラリとプラグインのバージョンを試してみました。

問題は、既存の永続的な接続を再利用する代わりに、接続カウンターが上昇するように、依然として接続が開かれたり閉じられたりすることです。

Redhat マシンで最新のソースから memcached デーモンをコンパイルしました。バージョン memcached-1.4.14 を使用し、「#/opt/memcached/bin/memcached -vvvv」で開始しました

最新のソース バージョン memcached-2.0.1 からコンパイルした php プラグインも、最新の状態にするために libmemcached-1.0.9 に対してコンパイルしました。現在、libmemcached-1.0.10 に対してはコンパイルされません。

私のPHPスクリプトは次のようになります。

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

$key = "key_" . uniqid();
$memcached = new Memcached( 'persistent' );
$memcached->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$memcached->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
$memcached->setOption(Memcached::OPT_SEND_TIMEOUT, 3000);
$memcached->setOption(Memcached::OPT_TCP_NODELAY, true);
$memcached->setOption(Memcached::OPT_PREFIX_KEY, 'persistent');

if( !count($memcached->getServerList() ) )
{
    $memcached->addServer( 'localhost', 11211 );
}
$memcached->set($key, 'value');
$value = $memcached->get($key);

print_r( $memcached->getStats() );
?>

スクリプトを起動すると、出力にサーバーが追加されず、タイムアウト期間が経過した後にのみ表示されます。

Array ( [@�qVG:11211] => Array ( [pid] => 3728 [uptime] => 73 [threads] => 4 [time] => 1343813688 [pointer_size] => 64 [rusage_user_seconds] => 0 [rusage_user_microseconds] => 6998 [rusage_system_seconds] => 0 [rusage_system_microseconds] => 31995 [curr_items] => 37 [total_items] => 37 [limit_maxbytes] => 67108864 [curr_connections] => 38 [total_connections] => 47 [connection_structures] => 39 [bytes] => 3589 [cmd_get] => 37 [cmd_set] => 37 [get_hits] => 37 [get_misses] => 0 [evictions] => 0 [bytes_read] => 3267 [bytes_written] => 39458 [version] => 1.4.14 ) )

しかし、接続カウンターはまだ上昇しており、クライアントが接続を作成し、サーバー側で永続的な接続が再利用されていると思います。

#netstat -an | grep 11211 | wc -l

tcp        0      0 ::1:11211                   ::1:55941                   VERBUNDEN   
tcp        0      0 ::1:55961                   ::1:11211                   VERBUNDEN   
tcp        0      0 ::1:55959                   ::1:11211                   VERBUNDEN   
tcp        0      0 ::1:11211                   ::1:56005                   VERBUNDEN   
...and so on

サーバー側では、永続性が使用されていることを示す詳細な出力が表示されます。

...
<43 get persistentkey_5018f83903ded
> FOUND KEY persistentkey_5018f83903ded
>43 sending key persistentkey_5018f83903ded
>43 END
...

多くの着信接続がある高パフォーマンス環境で memcache を使用したいのですが、現在、接続量によって apache の子が強制終了されています。本当の永続性を有効にする方法はありますか?

使用ソフトウェア:

  • Red Hat Enterprise Linux Server リリース 6.2 (サンティアゴ)
  • PHP バージョン 5.3.3
  • プリフォークの Apache/2.2.15
  • Memcache サーバー 1.4.14
  • libmemcached 1.0.9
  • PHP memcached プラグイン 2.0.1
4

2 に答える 2

2

Memcached::OPT_TCP_NODELAYこれは、すべてのリクエストでを設定しているためです。このようないくつかのオプションにより、libmemcachedライブラリは設定時に再接続を実行します。

接続オプションは存続するため、すべての要求でそれらを設定する理由はありません。したがって、以下を使用する必要があります。

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

$key = "key_" . uniqid();
$memcached = new Memcached( 'persistent' );

if( !count($memcached->getServerList() ) )
{
    $memcached->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
    $memcached->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
    $memcached->setOption(Memcached::OPT_SEND_TIMEOUT, 3000);
    $memcached->setOption(Memcached::OPT_TCP_NODELAY, true);
    $memcached->setOption(Memcached::OPT_PREFIX_KEY, 'persistent');
    $memcached->addServer( 'localhost', 11211 );
}
$memcached->set($key, 'value');
$value = $memcached->get($key);

print_r( $memcached->getStats() );
?>
于 2012-12-18T17:03:31.983 に答える
-1

Memcached 拡張機能を使用して実際の永続化を実現できるとは思いません。PHPの永続的なドキュメントから:

PHP-CGI を使用している場合

永続的な接続はアプリケーション プロセス全体で共有できますが、スクリプトの完了 (ページの読み込み) で閉じられます。

Apache の multiprocess モジュールを使用している場合

要求は、永続的な接続を使用して子プロセスをスピンオフします。新しいリクエストが来て、前のリクエストがまだ完了していない場合、既存の永続的な接続が使用されます。ただし、追加のリクエストが行われない場合、永続的な接続は子プロセスが完了すると閉じられます。

あなたが提供したスクリプトは、memcached のテストには効果的かもしれませんが、手動で実行するとそうではないかもしれません。jMeterを見てください。スレッド グループをすばやく作成して、アプリケーションに 100 人以上のユーザーを投入できます。

于 2012-08-07T20:34:08.987 に答える