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如果导致错误的语句由@错误控制运算符预先设置,则该值将是。

http://php.net/set_error_handler

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

于 2014-08-05T12:52:19.580 回答
0

在所有 dash community dot de 中有一条关于 PHP ste 的替代解决方案的评论

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。

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

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

于 2014-08-05T12:51:36.497 回答