FileStorage problem
- piler
- Člen | 111
Zdravim,
uz som to raz pisal, ale tema je zatvorena. Problem so popisoval tu
Ked zmenim
<?php
$handle = @fopen($file, 'r+b');
?>
na:
<?php
$handle = @fopen($file, 'w+');
?>
Tak to ziadnu chybu nevyhodi, ale ani cache nefunguje, lebo sa subor vytvara znova a znova.
„@“ chybu nepotlaci, takze to vyhodi „ladenka“. Nepouzivam v tom projekte cele nette, ale potrebujem tam vyuzit cache-ovanie a neviem co s tym. Resp. co to moze sposobovat.
Skusil som pridat controlu:
<?php
if (!is_file($file)) return NULL;
?>
a s tymto to funguje (s pridanim tejto kontroly este na dalsie miesto). Je mozne tuto controlu tam pridat, alebo je dovod preco to tam nie je (pomale, …). Nechcem velmi prepisovat nette kod, kedze pri updatoch by som to musel robit znova.
- David Grudl
- Nette Core | 8228
Je to z důvodu atomicity operací.
Dvě věci jsou mi divné: proč @fopen($file, ‚r+b‘); nefunguje a proč zobrazuje chybu. Můžeš sem zkusit poslat kompletní minimální kód, který chybu vygeneruje?
- piler
- Člen | 111
David Grudl napsal(a):
Je to z důvodu atomicity operací.
Dvě věci jsou mi divné: proč @fopen($file, ‚r+b‘); nefunguje a proč zobrazuje chybu. Můžeš sem zkusit poslat kompletní minimální kód, který chybu vygeneruje?
Takto pouzivam cache:
<?php
// nacitanie
$cache = Aplication::getCache();
$cacheKey = 'admin_js_tree_menu';
if (isset($cache[$cacheKey])) {
return $cache[$cacheKey];
}
....
// ulozenie
$cache->save($cacheKey, $menu, array(
'tags' => array('node'),
));
?>
Chyba:
fopen(/var/www/apache2-default/_stan/cms4/project/temp/cache/cache-cms%00admin_js_tree_menu) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory
Nette/Caching/FileStorage.php
<?php
Line 336: protected function readMeta($file, $lock)
Line 337: {
Line 338: $handle = @fopen($file, 'r+b'); // intentionally @
Line 339: if (!$handle) return NULL;
?>
Ak ten subor vytvorim manualne, alebo pridam tie kontroly na is_file(), tak vsetko funguje ako ma…
Verzia PHP: PHP 5.2.6–0.dotdeb.1
Ak by si potreboval viac informacii, tak ti mozem poslat html ladenky na email. Vdaka
- David Grudl
- Nette Core | 8228
Ono je v pořádku, že fopen při neexistujícím souboru vyhodí chybu (kvůli atomicitě se nedá jiné řešení použít). Ale divné je, že tu chybu zaznamenáš, když je před fopen zavináč.
Ta chyba se vypíše na obrazovku nebo do logu? Nepoužíváš třeba vlastní error_handler?
- piler
- Člen | 111
David Grudl napsal(a):
Ono je v pořádku, že fopen při neexistujícím souboru vyhodí chybu (kvůli atomicitě se nedá jiné řešení použít). Ale divné je, že tu chybu zaznamenáš, když je před fopen zavináč.
Ta chyba se vypíše na obrazovku nebo do logu? Nepoužíváš třeba vlastní error_handler?
Ten zavinac mi nepotlaca ziadne chyby, ani tie ktore by som chcel potlacit ja. Nemam tam ziadny vlastny error_handler, okrem pouzitia Nette\Debug.
V celom projekte najdem akurat error handler v dibi DibiException::tryError(), Tools::tryError()…co asi vplyv nema.
Asi je to nastavenim PHP, kedze to s Nette nic nema, kedze sa mi nepotlacaju ani vlastne chyby. Len mi nenapada co :(.
- paranoiq
- Člen | 392
zavináč ani error_reporting chyby předané vlastnímu handleru (=Laděnce) neovlivní. filtrují pouze výpis chybových hlášek na výstup. samotné zpracování chyb je jen na handleru, a ten je dostane všechny
navíc myslím, že neexistuje spolehlivý způsob jak by mohla Laděnka poznat, že chyba má být umlčena. zavináč se váže k výrazu a těch může být na jednom řádku víc…
omyl. beru zpět. vysvětleno na školení :)
funguje to tak, že zavináč před výrazem error reporting vypne a po výrazu
ho zas obnoví na původní hodnotu
Editoval paranoiq (10. 7. 2009 10:15)