2

memcached が実際に実行されているかどうかを判断するためのいくつかの実験の後、これを行う唯一の方法は、カスタム エラー ハンドラーを作成して、Memcache::connect によってスローされる通知/警告を抑制することであると思われます。

エラーを抑制する方法でこれに応答しないアプリケーションのエラーハンドラーが既にあります。

したがって、メソッドがある場合は、次のcheckRunning()ように言います。

public function checkRunning() {
    $test = new Memcache;
    return @$test->connect(CACHE_HOSTNAME, CACHE_PORT);
}

このメソッドにカスタム エラー ハンドラを適用して、既存のエラー ハンドラをオーバーライドせずに false を返すようにするにはどうすればよいですか?

4

2 に答える 2

1

エラーハンドラーが正しく書かれていないと思います。これに特に注意してください:

error_reporting()設定は効果がなく、エラー ハンドラが関係なく呼び出されますが、現在の値を読み取ってerror_reporting適切に処理することはできます。特に注意すべきことは0、エラーの原因となったステートメントの先頭に@エラー制御 operatorが追加された場合、この値は になるということです。

http://php.net/set_error_handler

エラー ハンドラが@オペレータに従った場合、コードは問題ないはずです。

于 2014-08-05T12:52:19.580 に答える
0

tom at all dash community dot de からの PHP ste に関する代替ソリューションについてのコメントがあります。

http://php.net/manual/de/memcache.connect.php


MemCache-Server が利用可能かどうかを確認するための、それほど自明ではない方法があります。

($memCache->connect() == false)を使用すると、接続できない場合にタイムアウトが発生するまで待機します。トラフィックの多いサイトを持っている場合、これはオプションではないかもしれません. そのため、サーバーがダウンしている場合、すべてのリクエストでこのタイムアウトを待機するのを避け、代わりに X 秒ごとに 1 回だけ再接続を試みることができます。

もしそうなら、このコードは役立つかもしれません:

<?php
$memCache = new \Memcache();
$memCache->addServer($host, $port);
$stats = @$memCache->getExtendedStats();
$available = (bool) $stats["$host:$port"];
if ($available && @$memCache->connect($host, $port))
    // MemCache is there
else
    // go on without MemCache
?>

getExtendedStats() の結果は配列です。情報は MemCache 自体によってキャッシュされ、維持されます。サーバーが利用できない場合、結果は FALSE になります。

結果が false でなくても、サーバーがまだ利用できない場合があります。したがって、 connect() != false もチェックする必要がありますが、最初のチェックで TRUE が返された場合のみ、ほとんどの場合 1 秒のタイムアウトを回避できます。サーバーがそこにない場合、 getExtendedStats() と connect() の両方が通知/警告を発行します。したがって、両方の通話をミュートする必要があります。

この目的で getServerStatus() を使用しないでください。結果はサーバー起動時にキャッシュされ、その間にサーバーへの接続がいつ失われたか (または再確立されたか) を認識しません。

于 2014-08-05T12:51:36.497 に答える