PHP-virheenkäsittely
- Edellinen sivu PHP Turvallinen sähköposti
- Seuraava sivu PHP Poikkeus
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ää.
- Edellinen sivu PHP Turvallinen sähköposti
- Seuraava sivu PHP Poikkeus