FileStorage problem

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

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

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

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

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

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

David Grudl
Nette Core | 8228
+
0
-

můžeš dát odkaz na výpis phpinfo()?

piler
Člen | 111
+
0
-

David Grudl napsal(a):

můžeš dát odkaz na výpis phpinfo()?

Mozem Ti HTML z phpinfo() kod poslat na email? Nemam to teraz kam zavesit.

David Grudl
Nette Core | 8228
+
0
-

ok, pošli

paranoiq
Člen | 392
+
0
-

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)