PHP-virheenkäsittely

PHP:ssä virheenkäsittely on oletusarvoisesti yksinkertaista. Viesti lähetetään selaimelle, ja viestissä on tiedostonimi, rivinumero ja virheen kuvaus.

PHP-virheenkäsittely

Skriptien ja web-sovellusten luonnissa virheenkäsittely on tärkeä osa. Jos koodissasi puuttuu virheen havaitsemiskoodi, ohjelma näyttää ammattimaiselta ja avaa ovia turvallisuusriskuille.

Tämä opas käsittelee PHP:n tärkeimpiä virheen havaitsemismenetelmiä.

Tämä oppaasti esittelee PHP:n tärkeimpiä virheen havaitsemismenetelmiä.

  • Käsittelemme erilaisia virheenkäsittelymenetelmiä:
  • Yksinkertainen "die()" lauseke
  • Mukautetut virheet ja virhetunnistimet

Virheraportointi

Perustavanlaatuinen virheenkäsittely: käytä die() funktiota

<?php
$file=fopen("welcome.txt","r");
?>

Jos tiedostoa ei ole olemassa, saat tällaisen virheen:

Varoitus: fopen(welcome.txt) [funktion fopen]: ei onnistunut avata virtausta: 
Ei ole sellaista tiedostoa tai hakemistoa C:\webfolder\test.php rivillä 2

Jotta käyttäjä ei saa yllä olevan kaltaista virheilmoitusta, tarkistamme tiedoston olemassaolon ennen tiedoston käsittelyä:

<?php
if(!file_exists("welcome.txt"))
 {
 die("Tiedostoa ei löydy");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

Nyt, jos tiedostoa ei ole olemassa, saat tällaisen virheilmoituksen:

Tiedostoa ei löydy

Yllä oleva koodi on tehokkaampaa kuin edellinen, koska se käyttää yksinkertaista virheenkäsittelymekanismia, joka lopettaa skriptin virheen jälkeen.

Mutta yksinkertainen skriptin lopettaminen ei aina ole sopiva tapa. Tutkitaan vaihtoehtoisia PHP-funktioita virheiden käsittelyyn.

Mukautetun virheenkäsittelijän luominen

Mukautetun virheenkäsittelijän luominen on erittäin yksinkertaista. Loimme yksinkertaisesti erityisen funktion, jota voidaan kutsua PHP:ssä tapahtuvan virheen yhteydessä.

Tämä funktio täytyy pystyä käsittelemään vähintään kaksi parametria (virhetaso ja virheilmoitus), mutta se voi hyväksyä enintään viisi parametria (valinnaisia: tiedosto, rivinumero ja virhekonteksti):

Syntaksi

error_function(error_level, error_message,
error_file, error_line, error_context)
Parametrit Kuvaus
error_level

Välttämätön. Määritetyn virheen virheraportointitaso. Se täytyy olla arvojen joukko.

Katso alla oleva taulukko: virheraportointitasot.

error_message Välttämätön. Määritetyn virheen virheilmoitus.
error_file Valinnainen. Määritä virheen tapahtunut tiedosto.
error_line Valinnainen. Määritä virheen tapahtunut rivi.
error_context Valinnainen. Määritä taulukko, joka sisältää virheen tapahtuessa käytössä olevat muuttujat ja niiden arvot.

Virheraportointitasot

Nämä virheraportointitasot ovat eri virhetyyppien virheenkäsittelyohjelman tarkoituksessa:

Arvo Muuttujat Kuvaus
2 E_WARNING Ei-fataalit suoritusajan virheet. Ei keskeytä skriptin suoritusta.
8 E_NOTICE

Suoritusajan ilmoitukset.

Skripti havaitsee, että virheen tapahtuminen on mahdollista, mutta se voi tapahtua myös silloin, kun skripti toimii normaalisti.

256 E_USER_ERROR Fataalit käyttäjän luomat virheet. Samanlaisia kuin ohjelmoijan PHP-funktiolla trigger_error() asettamat E_ERROR.
512 E_USER_WARNING Ei-fataalit käyttäjän luomat varoitukset. Samanlaisia kuin ohjelmoijan PHP-funktiolla trigger_error() asettamat E_WARNING.
1024 E_USER_NOTICE Käyttäjän luomat ilmoitukset. Samanlaisia kuin ohjelmoijan PHP-funktiolla trigger_error() asettamat E_NOTICE.
4096 E_RECOVERABLE_ERROR Käytettävissä olevat fataalit virheet. Samanlaisia kuin E_ERROR, mutta ne voidaan ottaa vastaan käyttäjän määrittämän käsittelevän ohjelman avulla. (Katso set_error_handler())
8191 E_ALL

Kaikki virheet ja varoitukset, paitsi E_STRICT-taso.

(PHP 6.0:ssa E_STRICT on osa E_ALL)

Tässä on virheenkäsittelyfunktion luominen:

function customError($errno, $errstr)
 { 
 echo "<b>Virhe:</b> [$errno] $errstr<br />";
 echo "Scriptin päättäminen";
 die();
 }

Yllä oleva koodi on yksinkertainen virheenkäsittelyfunktio. Kun se käynnistyy, se ottaa vastaan virhetason ja virheilmoituksen. Sitten se tulostaa virhetason ja ilmoituksen ja lopettaa skriptin.

Nyt kun olemme luoneet virheenkäsittelyfunktion, meidän täytyy määrittää milloin tämä funktio käynnistyy.

Aseta virheenkäsittelyohjelma

PHP:n oletusvirheenkäsittelyohjelma on sisäänrakennettu virheenkäsittelyohjelma. Aiomme muokata yllä olevaa funtiota skriptin suoritusvaiheen oletusvirheenkäsittelyohjelmaksi.

Voit muokata virheenkäsittelyohjelmaa, jotta se sovelletaan vain tiettyihin virheisiin, jolloin skripti voi käsitellä eri virheitä eri tavoin. Kuitenkin tässä esimerkissä aiomme käyttää omaa mukautettua virheenkäsittelyohjelmaamme kaikkien virheiden suhteen:

set_error_handler("customError");

Koska haluamme, että omaa mukautettua funtiomme käsittelee kaikki virheet, set_error_handler() tarvitsee vain yhden parametrin, mutta voit lisätä toisen parametrin, jotta voit määrittää virhetason.

Esimerkki

Testaa tätä virheenkäsittelyohjelmaa yrittämällä tulostaa olematonta muuttujaa:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Virhe:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

Yllä olevan koodin tulisi olla samankaltaista tällä tavalla:

Virhe: [8] Määrittelemätön muuttuja: test

Virheen käynnistäminen

Hyödyllinen virheen käynnistäminen käyttäjän syötön sijainnissa skriptissä, kun käyttäjän syöte on epäsyöttöä. PHP:ssä tämä tehtävä tehdään trigger_error()-funktiolla.

Esimerkki

Tässä esimerkissä, jos "test"-muuttuja on suurempi kuin "1", virhe tapahtuu:

<?php
$test=2;
if ($test>1)
{
trigger_error("Huomio: Arvon täytyy olla 1 tai alle");
}
?>

Yllä olevan koodin tulisi olla samankaltaista tällä tavalla:

Huomio: Arvon täytyy olla 1 tai alle
C:\webfolder\test.php rivillä 6

Voit käynnistää virheen skriptin missä tahansa kohdassa lisäämällä toista parametria, voit määrittää käynnistettävän virheen tason.

Mahdolliset virhetyyppien

  • E_USER_ERROR - fatalinen käyttäjän luoma ajastusvirhe. Virhe ei ole korjattavissa. Skriptin suoritus keskeytyy.
  • E_USER_WARNING - ei-fatalinen käyttäjän luoma ajastusvaroitus. Skriptin suoritus ei keskeyty.
  • E_USER_NOTICE - oletus. Käyttäjän luoma ajastusilmoitus. Skripti löytää mahdollisia virheitä, mutta virheitä voi tapahtua myös silloin, kun skripti sujuu normaalissa tilassa.

Esimerkki

Tässä esimerkissä, jos "test"-muuttuja on suurempi kuin "1", tapahtuu E_USER_WARNING-virhe. Jos E_USER_WARNING-virhe tapahtuu, käytämme mukautettua virheenkäsittelyohjelmaamme ja päättämme skriptin:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Virhe:</b> [$errno] $errstr<br />";
 echo "Scriptin päättäminen";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Arvon täytyy olla 1 tai alle",E_USER_WARNING);
 }
?>

Yllä olevan koodin tulisi olla samankaltaista tällä tavalla:

Virhe: [512] Arvon täytyy olla 1 tai alle
Scriptin päättäminen

Nyt kun olemme oppineet, miten luoda omia virheitä ja miten ne käynnistetään, tutkitaanpa virheenkirjauksia.

Virheenkirjaus

Oletusarvoisesti, php.ini-tiedostossa olevan error_log-asetuksen mukaan PHP lähettää virheenkirjaukset palvelimen virheenkirjausjärjestelmälle tai tiedostolle. Käyttämällä error_log()-funktiota voit lähettää virheenkirjaukset määrätylle tiedostolle tai etä目的地lle.

Lähetä virheilmoituksia itsellesi sähköpostitse, mikä on hyvä tapa saada tieto tietystä virheestä.

Virheilmoituksen lähettäminen sähköpostitse

Alla olevassa esimerkissä, jos tietty virhe tapahtuu, lähetämme virheilmoituksen sisältävän sähköpostin ja päättämme skriptin:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Virhe:</b> [$errno] $errstr<br />";
 echo "Webmaster on ilmoitettu";
 error_log("Virhe: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Arvon täytyy olla 1 tai alle",E_USER_WARNING);
 }
?>

Yllä olevan koodin tulisi olla samankaltaista tällä tavalla:

Virhe: [512] Arvon täytyy olla 1 tai alle
Webmaster on ilmoitettu

Yllä olevasta koodista saadut sähköpostit ovat samankaltaisia tällä tavalla:

Virhe: [512] Arvon täytyy olla 1 tai alle

Tämä menetelmä ei ole sopiva kaikille virheille. Yleiset virheet tulisi kirjata palvelimelle käyttämällä PHP:n oletusvirheenkirjausjärjestelmää.