Php Memcached是否在未发出通知/警告的情况下运行

Php Memcached是否在未发出通知/警告的情况下运行,php,memcached,custom-error-handling,Php,Memcached,Custom Error Handling,在尝试确定memcached是否实际运行后,似乎唯一的方法是创建一个自定义错误处理程序来抑制Memcache::connect引发的通知/警告 我已经为我的应用程序提供了一个错误处理程序,它不会以抑制错误的方式对此做出响应 所以如果我有一个方法,比如说checkRunning(): public function checkRunning() { $test = new Memcache; return @$test->connect(CACHE_HOSTNAME, CAC

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

我已经为我的应用程序提供了一个错误处理程序,它不会以抑制错误的方式对此做出响应

所以如果我有一个方法,比如说
checkRunning()

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

如何将自定义错误处理程序应用于此方法,使其仅返回false,而不覆盖现有的错误处理程序?

tom在所有dash社区的网站上都发表了关于PHP ste上的替代解决方案的评论


有一种不太明显的方法可以检查MemCache服务器是否可用

如果无法连接,则使用($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时才为false,从而在大多数情况下避免了1秒超时。 如果服务器不在,getExtendedStats()和connect()都会发出通知/警告。因此,您必须使两个呼叫静音


不要为此目的使用getServerStatus():结果会缓存在服务器启动时,并且不会识别与服务器之间的连接何时丢失(或重新建立)。

我猜您的错误处理程序编写得不正确。特别注意这一点:

设置将不起作用,您的错误处理程序将被调用,但您仍然能够读取的当前值并采取适当的行动。需要特别注意的是,如果导致错误的语句是由


如果您的错误处理程序遵循
@
运算符,那么您的代码应该是正确的。

@
应该完全抑制由此引发的任何错误。这仍然会调用您的错误处理程序,是的。错误处理程序必须自行检查是否应该执行操作。注意:MemCache不是Memcached。这是两件不同的事情,我也必须找出。这也将调用您的错误处理程序。您可能希望暂时禁用它并返回默认处理程序。@error control运算符不会抑制此错误。不管我是否使用@符号,错误处理程序返回2和8作为通知和警告。是的,错误处理程序仍将被调用。但是如果使用了
@
,则
错误报告
标志将设置为
0
,因此由您的错误处理程序检查该标志,而不执行任何操作。是的,我阅读了更多的评论,发现我需要查找
错误报告()==0
,并将其添加到我的处理程序中,效果非常好。这是我整个框架中唯一使用@符号的地方,所以我没有意识到处理程序没有管理它。谢谢你的帮助:)