Memcached是否在没有投掷通知/警告的情况下运行

时间:2014-08-05 12:05:13

标签: php memcached custom-error-handling

在尝试确定memcached是否实际运行的一些实验之后,似乎唯一的方法是创建一个自定义错误处理程序来抑制Memcache :: connect

引发的通知/警告

我的应用程序已经有一个错误处理程序,它不会以一种可以抑制错误的方式对此做出响应。

因此,如果我有方法,请说checkRunning(),如此:

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

如何将自定义错误处理程序应用于此方法,以便它只返回false,而不会覆盖现有的错误处理程序?

2 个答案:

答案 0 :(得分:1)

我猜你的错误处理程序根本没有正确编写。特别注意这一点:

  

error_reporting()设置无效,您的错误处理程序将被调用 - 但是您仍然可以读取error_reporting的当前值并采取适当的行动。特别值得注意的是,如果导致错误的语句由@ error-control operator预先添加,则此值将为0

     

http://php.net/set_error_handler

如果您的错误处理程序服从@运算符,那么您的代码应该没问题。

答案 1 :(得分:0)

在所有破折号社区dot de

上有关于PHP ste的替代解决方案的评论

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

<小时/> 有一种不太明显的方法可以检查MemCache服务器是否可用。

如果无法连接,则使用($ memCache-&gt; connect()== false)将等待超时。如果你有一个高流量的网站,这可能不是一个选择。因此,当服务器关闭时,您可能希望避免在每个请求上等待此超时,而是尝试每X秒仅重新连接一次。

如果是这样,这段代码可能有所帮助:

<?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。

即使结果不是假,服务器仍可能无法使用。因此,您还需要检查connect()!= false,但仅当第一次检查返回TRUE时,因此在大多数情况下避免1秒超时。 如果服务器不在那里,getExtendedStats()和connect()都会发出通知/警告。因此,您必须将两个呼叫静音。

不要为此目的使用getServerStatus():结果缓存在server-start上,并且无法识别与服务器的连接何时丢失(或重新建立)。