MemcachedStorage vyhodí notice, pokud neběží memcache daemon
- Sochi
- Člen | 17
Zdravím, narazil jsem na malý problém (není to sice vyloženě chyba, ale rozhodně je docela na obtíž) a to, že ve tříde MemcachedStorage se kontroluje návratová hodnota při volání Memcache::addServer (a vyvolá se adektávní výjimka), což ale nezaručí, že připojení k daemonu proběhne bez problémů (např. v dokumentaci se rovnou píše, že „the network connection is not established until actually needed. Thus there is no overhead in adding a large number of servers to the pool, even though they might not all be used“; http://php.net/…ddserver.php).
Pokud ale memcached neběží, volání Memcache::get způsobí pouze notice
Memcache::get(): Server 127.0.0.1 (tcp 11211) failed with: Connection refused (111)
Neměla by takový stav už z principu ošetřit samotná třída MemcachedStorage? Nebylo by možné třídu upravit tak, aby zavolala před prvním pokusem o připojení (před prvním voláním Memcache::get) metodu Memcache::getExtendedStats ke zjištění aktuálního stavu serveru a případně vyvolala výjimku?
Narazil jsem i na starší vlákno s podobným tématem, ale zřejmě ještě z doby, kdy třída MemachedStorage používala metodu Memcache::connect, a to https://forum.nette.org/…di-se-notice
- Sochi
- Člen | 17
hrach napsal(a):
Používá, ale většinou nám běží… :)
Většinou běží každému, ale pro případy kdy ne (zapomene se při nastavování nového serveru, daemon se omylem nespouští automaticky po rebootu, atd.) by to bylo vhodné toto ošetřit. V takových situacích (při nastavení výchozího cacheStorage na memcached)
cacheStorage:
class: MemcachedStorage
arguments:
- %memcache.host%
- %memcache.port%
- %memcache.prefix%
je totiž chování některých součástí Nette relativně nepředvídatelné (ve vlastních presenterech si to samozřejmě člověk ošetří). Například místy přestane fungovat „automatický výběr sloupců“ v databázových selectech (i když jsem teda nepřišel na to, proč se tak děje; můžu to ale replikovat a se zapnutou memcache se problém zmizí).
A v produkční verzi potlačený notice (informující o problému s připojením na daemona) ke hledání chyby určitě nepomůže.. :)
- patriksima
- Člen | 58
Lze to otestovat hned, například takto (vytaženo z php.net)
<?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
?>