Chybová hlášení PHP - error_reporting
Chybová hlášení PHP jsou na všech webserverech ONEbit.cz implicitně vypnuta, aby v nezávažných případech neobtěžovaly návštěvníky Vašich stránek. V případě výskytu problému v PHP skriptu však doporučujeme chybový výstup zapnout a prověřit. Změnu nastavení lze provést několika způsoby:
Při změně nastavení je nezbytné uvést úroveň (level), jinými slovy - jak závažné chyby mají být zobrazovány. Podrobný popis naleznete v dokumentaci PHP http://cz.php.net/error_reporting. Pro ilustraci uvádíme nejčastější příklady použití:
| Popis | error_reporting() | Level (PHP4) | Level (PHP5) | Level (PHP5.3) |
| Vypnout všechna hlášení (implicitní) | 0 | 0 | 0 | 0 |
| Zapnout všechna hlášení | E_ALL | 2047 | 6143 | 30719 |
| Zapnout pouze chyby a varování | E_ERROR | E_WARNING | E_PARSE | 7 | 7 | 7 |
| Zapnout všechna hlášení, kromě notice | E_ALL ^ E_NOTICE | 2039 | 6135 | 30711 |
| Všechna hlášení, kromě deprecated | E_ALL ^ E_DEPRECATED | - | - | 22527 |
Hodnota level (úroveň) vychází ze součtu hodnot reprezentujících jednotlivé konstanty (E_ERROR, atp.) - viz. manuál PHP. Pro různé verze PHP se některé hodnoty liší, neboť byly do PHP postupně integrovány další konstanty (týká se pouze číselné interpretace). Opět veškeré informace naleznete v manuálu PHP.
Od verze PHP 5.3.0 byly zavedeny další typy chyb, zejména E_DEPRECATED, prostřednictvím které PHP upozorňuje na zastaralé funkce, které budou v PHP6 odstraněny.
Funkce error_reporting()
Výhodou použitím PHP funkce je především interaktivita - úroveň chyb můžete měnit kdekoliv v průběhu skriptu. To například umožňuje zapnutí chyb pouze v problémové části skriptu nebo podmínit na IP, atp.
Příklad použití:
<?php
ini_set("display_errors", 1); //nepouzivejte v PHP4
error_reporting(E_ERROR | E_WARNING);
$a = 5 / 0; //chyba deleni nulou
?>
Výstup skriptu:
Warning: Division by zero in /hosting/www/example.com/www/test.php on line 4
Nevýhoda funkce error_reporting() se ukrývá v nefunkčnosti E_PARSE - syntaktických chyb. Důvod je prostý - v případě výskytu syntaktické chyby PHP vůbec skript nespustí, a tedy k zavolání funkce error_reporting() ani nedojde. Tento nedostatek řeší globální změna levelu jedním z následujících způsobů.
Nastavení error reporting pomocí .user.ini
(pouze pro PHP 5.3.0 nebo vyšší)
Změna úrovně uvnitř .user.ini přenastaví vypisování hlášek pro všechny PHP skripty volané uvnitř adresáře (vč. podadresářů). Jako parametr se uvádí rozsah druhů chyb číselnou hodnotou (viz. výše) nebo pomocí konstant (syntaxe shodná s php.ini). Více informací o nastavování PHP pomocí souboru .user.ini naleznete zde.
Příklad kódu v .user.ini:
error_reporting = 22527
display_errors = 1
nebo
error_reporting = E_ALL & ~E_DEPRECATED
display_errors = 1
Nastavení error reporting pomocí .htaccess
(pouze pro PHP 5.2.x nebo nižší)
Změna úrovně uvnitř .htaccess přenastaví vypisování hlášek pro všechny PHP skripty volané uvnitř adresáře (vč. podadresářů). Jako parametr musí být uvedena číselná hodnota udávající požadovaný rozsah hlášek (viz. výše).
Příklad kódu v .htaccess:
<IfModule mod_php5.c>
php_value error_reporting 6143
php_flag display_errors 1
</IfModule>
Zápis chyb do souboru (error log)
(pouze pro PHP 5.3.0 nebo vyšší)
Tento způsob se využívá v případech, kdy potřebujete zapnout chybový výpis na již veřejně běžících stránkách. Chybové výpisy tak putují do souboru a neobtěžují návštěvníky stránek. Hodit se také může u skriptů, jejichž výstup se nezobrazuje textově uvnitř stránek. Tento způsob zachytí také syntaktické chyby.
Příklad kódu v souboru .user.ini:
log_errors = 1
error_reporting = E_ALL & ~E_DEPRECATED
error_log = /hosting/www/example.com/www/error.log
Absolutní cesta /hosting/www/example.com udává umístění domény na serveru, následuje název subdomény www a název souboru error.log, do kterého bude PHP zapisovat všechny chyby vyskytující se pod doménou www.example.com.
Zvolený level error_reporting může být za běhu skriptu změněn pomocí funkce error_reporting(), proto překontrolujte případná volání této funkce.
Důležité upozornění
Zápis chyb do souboru používejte pouze dočasně při ladění skriptu, nenechávejte nastavení zapnuté natrvalo. Soubor by mohl velice rychle nabývat na objemu (zejména při vyšší návštěvnosti) a nečekaně zaplnit přidělenou diskovou kvótu Vaší domény.
Jakékoliv kopírování, publikování nebo šíření obsahu je výslovně zakázáno bez předchozího písemného souhlasu společnosti ONEsolution s.r.o.