Memcached运行时没有抛出通知/警告


Is Memcached Running without Throwing Notice/Warning

在尝试确定memcached是否实际运行之后,似乎唯一的方法是通过创建一个自定义错误处理程序来抑制Memcache::connect抛出的通知/警告

我的应用程序已经有了一个错误处理程序,它不会以一种抑制错误的方式响应这个错误。

如果我有一个方法,比如checkRunning(),像这样

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

我如何应用自定义错误处理程序到这个方法,使它只返回false,而不覆盖我现有的错误处理程序?

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

error_reporting()设置将没有效果,您的错误处理程序将被调用,无论如何,您仍然能够读取error_reporting的当前值并采取适当的行动。特别要注意的是,如果引起错误的语句前面有@错误控制操作符,则该值将为0

http://php.net/set_error_handler

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

tom在all dash community。de

有一个关于PHP站点的替代解决方案的评论。http://php.net/manual/de/memcache.connect.php


有一种不太明显的方法可以检查MemCache-Server是否可用。

使用($memCache->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。

即使结果不为false,服务器可能仍然不可用。因此,您也需要检查connect() != false,但只有在第一次检查返回TRUE时才需要检查,从而避免在大多数情况下出现1秒超时。如果服务器不在,getExtendedStats()和connect()都会发出通知/警告。因此,您必须将两个呼叫都静音。

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