Autor Zpráva
Tori
Profil
Pěkný večer.

Poradili byste prosím nějaký způsob, jak najít chybu v PHP za takovýchto okolností:
* nemám přístup k error logu Apache
* v .htaccess nemůžu nastavovat logování ani php_flag
* zobrazování chyb je vypnuté. Místo chyby se zobrazí jen HTTP 500 - chyba serveru.

Pokouším se najít chybu, která se bohužel na localhostu neprojevuje, zatím marně. Mám nastavené logování do souboru, i jako error_handler a shutdown_function. Občas se do logu zapíše i compile error, ale většinou se prostě nezobrazí nikde nic. Zkoušela jsem popřidávat na různá místa nějaký výstup, přibližně asi vím, kde k chybě dochází, ale přidaný výstup generuje další chyby (headers already sent, třída vyhazuje výjimku). Snažila jsem se chytat všechny možné výjimky, ale není to nic platné zatím.
Jak se tohle obvykle řeší? Ideálně si představuju, že bych někde v nastavení něco povolila, pak si v logu přečetla kam až skript došel a na co umřel a opravila to - dá se to udělat nějak podobně jednoduše? (web je hostovaný u Wedosu, ale nemůžu po podpoře chtít, aby hledali chyby ve skriptech)
meris
Profil
Hezký večer i tobě,
a) zvážil bych nasazení Nette/Diagnostic, Laděnka zachytí hodně chyb a vypíše hodně podrobné informace. Takto by jsi mohla nahradit to logování. Otázka je jestli máš nějkaý framework, či nikoli.
b) postupné krokování, pomalé doplňováí die(), var_dump() na místa kde by moha být chyba a zjišťoval kam přijdou chybná data, dá se využít i @, například u volání do db a zjištění chyby ke které došlo.
Majkl578
Profil
Hledat chyby způsobené nekompatibilitou aplikace s produkčním serverem (který mívá často odlišná nastavení) může být docela oříšek. Naštěstí již zmíněné debugování a zpracování chyb pomocí Nette\Diagnostics člověku ušetří spoustu práce a usnadní život. Navíc lidé, kteří nechtějí používat Nette jako celek ocení, že Nette\Diagnostics lze použít nezávisle na tom, jak je napsaný zbytek aplikace. Rozhodně doporučuji vyzkoušet, s případnými dotazy ohledně nastavení se obrať na fórum nebo (možná lépe) na Jabber.

Nicméně, pokud by použití Nette nebylo možné, můžeš nastavit logování chyb do tebou určeného souboru (ini_set('error_log', 'logfile.log')).
Většina chyb by měla jít zachytávat vlastním error/exception handlerem, výjimkou jsou vpodstatě jen kompilační a parse chyby.
Tori
Profil
meris, Majkl578:
Framework je zčásti vlastní (router, mvc), zčásti Nette (šablony, cache). Děkuju za tip - Laděnku jsem zkusila, logování do Firebugu je moc pěkné, taky ji přidám do fw. Problém je, že např. přidám neexistující funkci, tak Laděnka zachytí chybu, hlášky poslané do firebugu dojdou, ale jinak pořád dostávám server error. Snad budu mít brzo volný den dva na odkrokování, asi to jinak nepůjde.

Majkl578:
Většina chyb by měla jít zachytávat vlastním error/exception handlerem, výjimkou jsou vpodstatě jen kompilační a parse chyby.
To mi právě nejde do hlavy, že by mezi skoro stejnými verzemi PHP (Apache + 5.3.5 na locale, CGI/FastCGI + 5.3.6 na prod.) mohl být takový rozdíl, aby způsobil chybu během kompilace.
meris
Profil
Nastavení php.ini? Případně ověření nainstalovaných modulů? Doba za po kterou skript běží, memory limit? Jsou všechny soubory korekntně nahrané?
U laděnky je problém že posílá hlavičku 500, když dojde k chybě, takže jestli je apache nastavený tak aby 500 odchytl a poslal vlastní stránku tak odchytí i výpis Laděnky. Myslím že by mělo jít tam nastavit jinou odpověd.
Davex
Profil
Tori:
* zobrazování chyb je vypnuté. Místo chyby se zobrazí jen HTTP 500 - chyba serveru
Možná to jde zapnout v administraci hostingu. Tam přístup také nemáš?

nemůžu po podpoře chtít, aby hledali chyby ve skriptech
Ale do error logu by se podívat mohli. Za zeptání nic nedáš.
Tori
Profil
Davex:
Omlouvám se za dezinformaci, display_errors byly zapnuté - myslela jsem že nejsou, když jsem pořád dostávala server error. (A přes administraci to nastavovat mohu, ale čertvíproč mi to nenapadlo.) Ohledně error logu mi na podpoře chlapík napsal, že ani on k tomu nemá přístup.

Jinak chyby byly nakonec dvě:
* Výpis proměnné v šabloně, zapsané takto:
<a onclick="javascript: pageTracker._trackPageview('/scores/{$link[filename]}');"
Latte se marně snažilo o kontextové escapování, ve výsledku se místo jména souboru dumpnula většina frameworku a pak cyklicky dokola něco z Latte maker -> error log: (32)Broken pipe: core_output_filter: writing data to the network. Pomohlo explicitně vypnout escapování.
* jako filtr pro šablonový stroj z Nette jsem registrovala jeden z helperů - anonymní funkci. Potřebovala jsem v ní přístup k vlastnostem aktuální instance, tak jsem je zkoušela poslat zabalené do objektu (na localu mi to prošlo):
private function addHelpers() {
  $that = (object) array(
    'router' => $this->router,
    'config' => $this->config, ...);
  $this->helpers['neco'] = function () use ($that) { ... };
Pomohlo uložit každou vlastnost do samostatné proměnné:
function () use (&$router, $config, ...) { }


Děkuju všem za pomoc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0