MemcachedStorage vyhodí notice, pokud neběží memcache daemon

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Sochi
Člen | 17
+
0
-

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
+
0
-

Stále žádná reakce? Nikdo nepoužívá Memcached?

hrach
Člen | 1819
+
0
-

Používá, ale většinou nám běží… :)

Sochi
Člen | 17
+
0
-

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.. :)

hrach
Člen | 1819
+
0
-

Nejlepsi bude to fixnout a udelat PR. V opacnem pripade otevrit issue na githubu, ne jenom tam pastnout tento link, ale taky to pekne (klidne kratce) anglicky popsat :) tady to casto zapadne.

enumag
Člen | 2118
+
0
-

Vytvořil jsem issue. Nejsem si úplně jistý jak to opravit. Volat connect? Mělo by storage umět i perzistentní spojení?

patriksima
Člen | 58
+
0
-

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
?>
patriksima
Člen | 58
+
0
-

Poslal jsem pull request.