E-learn.ro
Panou utilizatori
Utilizator Parola
Creeaza cont nou    Recupereaza parola
Login
Newsletter
Introdu adresa ta de email
Inscrie-te
Inchide panoul de utilizatori
Add to Google

Tutoriale PHP

Descarca toolbar

Toolbar E-learn.ro Facebook Twitter

WEB DEVELOPMENT  /  PHP  /  Introducere in PHP (24)

XII. "Enervand" virusii (partea I)

04.08.2008
XII.

Pana si cei mai buni developeri gresesc uneori. De aceea, majoritatea limbajelor de programare- inclusiv PHP - vin impreuna cu posibilitati interne de a depista erorile si de a lua masuri de remediere.

Total vizualizari: 3016 3016 afisari   |   Comentarii  0   |   Rating   |   (1 vot)   |   Timp necesar: 25 min 25 min   |   Nivel de cunostiinte necesar: Mediu  Mediu

Sursa:  Devzone.zend.com  
Autor:  Vikram Vaswani
Adauga la tutoriale favorit Adauga la tutoriale favorite
Pagina:
1
comenteaza printeaza

Protejarea codului

Pana si cei mai buni developeri gresesc uneori. De aceea, majoritatea limbajelor de programare- inclusiv  PHP – vin impreuna cu posibilitati interne de a depista erorile si de a lua masuri de remediere. Aceasta actiune se poate concretiza in simpla afisare a unui mesaj de eroare, sau in actiunea complexa de a trimite un e-mail administratorului site-ului, cu o traiectorie in stiva.

Pentru a facilita acest lucru, PHP vine cu un API de manipulare a erorilor cu toate optiunile, care poate fi folosit pentru a detecta si pentru a solutiona erorile. In plus fata de luarea unei decizii cu privire la ce tipuri de eroare intalneste un utilizator, poti de asemenea sa iti inlocuiesti mecanismul intern de manipulare a erorilor cu propriile tale functii individualizate (de obicei mai creative). Daca folosesti PHP 5, primesti un bonus:  un model nou-nout de exceptie, care te lasa sa iti invelesti codul in blocuri try-catch(), asemeneatoare cu cele Java, pentru o manipulare mai eficienta a erorilor.

In aceasta editie a lui PHP 101, voi discuta toate aceste aspecte, oferindu-ti un curs fulger despre cum sa adaugi optiunea de gestionare a erorilor aplicatiei tale PHP. Continua sa citesti – ai aici niste chestii destul de interesante!

Inventarul criminalilor

Inainte sa trecem la notiunile de baza ale constituirii unui handler de erori, ai nevoie sa cunosti putina teorie.
In mod normal, cand o secventa de instructiuni PHP intampina o eroare, ea afiseaza un mesaj care indica cauza erorii si care are si capacitatea (in functie de cat de grava este eroarea) sa delimiteze executia secventei de instructiuni. Insa, desi acest comportament este acceptabil in timpul fazei de dezvoltare, el nu poate continua odata ce  o aplicatie PHP a fost lansata catre utilizatorii sai de drept.

In situatiile reale, nu este un lucru de profesionist sa se afiseze mesaje criptate de eroare (care sunt de cele mai multe ori ininteligibile pentru utilizatorii care nu cunosc programare); este mai profesionist sa se intercepteze aceste erori si fie sa se reglementeze (daca acest lucru este posibil), sau sa se notifice utilizatorul printr-un mesaj de eroare inteligibil (daca nu este posibila solutionarea).

Acestea sunt trei tipuri elementare de erori  de timp de rulare in PHP:

1. Notificari: Acestea sunt erori la ordinea zilei, nu sunt grave, iar PHP le intampina in timpul executarii unei secvente de instructiuni – de exemplu, accesarea unei variabile care nu a fost inca definita. In mod predefinit, asemenea erori nu sunt deloc afisate la utilizator – desi, dupa cum vei vedea, poti interveni cu modificari asupra acestui comportament predefinit.

2. Avertismente: Aceastea sunt erori mai grave – de exemplu, incercarea de a  include() un fisier care nu exista. In mod predefinit, aceste erori sunt afisate la utilizator, insa nu se definitiveaza cu blocarea executarii secventei de instructiuni.

3. Erori fatale: Acestea sunt erori critice – de exemplu, instantierea unui obiect apartinand unei clase inexistente, sau apelarea unei functii inexistente. Aceste erori pot atrage dupa sine terminarea secventei de instructiuni, iar comportamentul predefinit al PHP este acela de a le afisa la utilizator atunci cand se produc.

Ar trebui sa atragem atentia asupra faptului ca o eroare de sintaxa intr-o secventa de instructiuni – de exemplu, o acolada sau un punct-si-virgula lipsa – este tratata ca o eroare fatala si rezulta in blocarea finalizarii secventei de instructiuni. De aceea, daca uiti sa pui un punct si virgula la finalul uneia din instructiunile PHP, acesta va refuza sa execute secventa de instructiuni pana ce nu corectezi greseala.

Erorile PHP pot fi generate de catre motorul Zend, de catre functiile interne PHP, sau de catre functiile definite de catre utilizator. Acestea pot interveni la timpul de demarare, la cel de derivare, de compilare sau de rulare. Intern, aceste variatii sunt reprezentate prin douasprezece tipuri deosebite de erori (ca si cele ale PHP 5), si poti citi despre ele la http://www.php.net/manual/en/ref.errorfunc.php. Constantele denumite, cum ar fi E_NOTICE si E_USER_ERROR asigura un mod convenabil de a asigna referinte diverselor tipuri de erori.

Un indiciu rapid aici: in cea mai mare parte a timpului, iti vei face probleme cu privire la erorile de timp de rulare (E_NOTICE, E_WARNING si E_ERROR: notificare, avertisment si eroare) si la erorile cauzate de utilizator (E_USER_NOTICE, E_USER_WARNING and E_USER_ERROR). Pe durata fazei de depanare, poti folosi comanda rapida E_ALL pentru a vedea toate erorile fatale si ne-fatale generate de catre secventa ta de instructiuni, iar in  PHP 5 ai putea de asemenea dori sa folosesti noul tip de eroare E_STRICT pentru a vizualiza erorile care afecteaza compatibilitatea ulterioara a codului tau.

Avertisment precoce

Acum, ca am scapat de teorie, sa ii aplicam cateva exemple. Sa luam urmatoarea frantura de cod:

<?php 
 
// initializeaza variabila $string
$string = 'a string'; 
 
// imparte sirul de caractere utilizand functia explode()
// aceasta va genera un avertisment sau E_WARNING 
// deoarece functia explode() are mai multi parametri
explode($string); 
 
?>

Daca rulezi aceasta secventa de cod, vei obtine o eroare ne-fatala - E_WARNING, ceea ce inseamna ca daca ai mai avut instructiuni ce au urmat dupa apelarea lui explode(), acestea tot ar mai fi executate. Incearca si tu si vezi! Pentru a genera o eroare fatala, trebuie sa depui mai multa munca. Arunca o privire aici:

<?php 
 
// apeleaza o functie ce nu exista
// codul va genera o eroare fatala (E_ERROR) 
callMeJoe(); 
 
?>

Aici, apelarea unei functii inexistente  declanseaza toate mecanismele de alarma ale PHP si genereaza o eroare fatala, care opreste imediat executia secventei de instructiuni.

Acum, iata partea interesanta. Poti controla care erori sunt afisate la utilizator, folosind o functie interna PHP numita error_reporting(). Aceasta functie accepta o constanta denumita, si spune scriptului sa raporteze doar erorile care corespund acelui tip. Pentru a vedea acest lucru in actiune, ia in considerare urmatoarea rescriere a secventelor anterioare de instructiuni pentru a „ascunde” erorile ne-fatale:

<?php 
 
// raporteaza doar erorile fatale 
error_reporting(E_ERROR); 
 
// initializeaza variabila $string
$string = 'string'; 
 
// imparte sirul de caractere utilizand functia explode()
// aceasta nu va genera un avertisment
// deoarece doar erorile fatale sunt raportate 
explode($string); 
 
?>

In acest caz, cand secventa de instructiuni se executa, nu va fi generat nici un avertisment, chiar daca apelarea lui explode() contine cu un argument mai putin decat ar trebui. Poti folosi o tehnica similara pentru a impiedica afisajul erorilor fatale:

<?php 
 
// raporteaza doar erorile care nu sunt fatale
error_reporting(~E_ERROR); 
 
// apeleaza o functie ce nu exista
callMeJoe(); 
 
?>

Tine minte, totusi, ca, doar pentru ca eroarea nu este raportata, nu inseamna ca ea nu se produce. Desi scriptul de mai sus nu va afisa un mesaj vizibil de eroare, executarea scriptului se va opri in punctul de producere a erorii, iar instructiunile ulterioare acelui punct nu vor fi executate. error_reporting() iti da control asupra acelor erori care trebuie afisate; nu preintampina aparitia in sine a erorilor.

Ia aminte ca mai exista setari in cadrul  php.ini care ar trebui folosite cu ocazia realizarii siteurilor. Poti (si trebuie) sa opresti  display_errors, sa stipulezi un fisier error_log si sa treci pe log_errors.

De asemenea, ia aminte ca abordarea folosita mai sus pentru a ascunde mesajele de eroare, desi extrem de simpla, nu se recomanda pentru utilizarea de larga practica. Blocarea si ignorarea tuturor erorilor, indiferent de tip, este o practica ineficienta in programare; este mult mai bine – si mai profesionist – sa anticipam posibilele greseli in avans, si sa elaboram un cod defensiv care sa fie in garda si care sa le gestioneze in mod adecvat. Acest lucru va impiedica utilizatorii de la a se trezi uitandu-se la o pagina goala, fara a primi nici o explicatie, atunci cand ceva nu merge bine.

In felul tau

Cu asta in minte, sa vorbim putin despre schimbarea modului in care sunt gestionate erorile. Ia in calcul un mesaj tipic de eroare in PHP: listeaza tipul de eroare, un mesaj descriptiv, si numele secventei de instructiuni care a generat eroarea. In cea mai mare parte a timpului, acest lucru este mai mult decat suficient... insa, daca seful tau este un client pretentios, si insista ca trebuie sa existe si un „mai bine”?

Ei bine, chiar exista. Este vorba despre o mica functie numita set_error_handler(), si iti permite sa derivi toate erorile PHP intr-o functie individualizatape care ai definit-o, in loc sa le transmiti catre programul handler predefinit. Aceasta functie trebuie sa fie capabila sa accepte minimum doua argumente obligatorii (tipul de eroare si un mesaj descriptiv corespunzator) si pana la trei argumente suplimentare (numele fisierului si numarul randului in care a intervenit eroarea, precum si o depozitare a variabilei spatiu la momentul erorii).

Urmatorul exemplu ar putea sa te lamureasca:

<?php 
 
// defineste-ti propriul handler de erori
set_error_handler('oops'); 
 
// initializeaza variabila $string
$string = 'a string'; 
 
// apeleaza functia explode()
// aceasta va genera un avertisment sau E_WARNING 
// deoarece functia explode() are mai multi parametri
// notificarea va fi preluat de handler-ul de erori
explode($string); 
 
// handler-ul de erori
function oops($type, $msg, $file, $line, $context) { 
    echo "<h1>Eroare!</h1>"; 
    echo "O eroare a aparut la executia acestui script. 
              Va rugam contactati administratorul site-ului."; 
    echo "<p />"; 
    echo "Iata informatia furnizata de script:"; 
    echo "<hr><pre>"; 
    echo "Codul erorii: $type<br />"; 
    echo "Mesaj: $msg<br />"; 
    echo "Numele fisierului si linia la care a aparut eroarea: 
    $file:$line<br />"; 
    $variable_state = array_pop($context); 
    echo "Statusul variabilei care a generat eroarea: "; 
    print_r($variable_state); 
    echo "</pre><hr>"; 
} 
 
?>

Functia set_error_handler() comunica scriptului ca toate erorile trebuie orientate catre functia definita de catre utilizator - oops(). Aceast functie este configurata astfel incat sa accepte cinci argumente: tipul erorii, mesaj, numele fisierului, numarul randului, si o matrice continand numeroase informatii cu privire la contextul in care s-a produs (inclusiv serverul si platforma, cat si informatiile secventei de instructiuni). Elementul final al matricei de context contine valoarea curenta a variabilei responsabile. Aceste argumente sunt apoi folosite pentru a crea o pagina de eroare care sa fie mai prietenoasa si mai informativa decat mesajul standard de eroare, de un rand.

Poti folosi handlerul de eroare individualizat pentru a modifica mesajul de eroare pe  care il vede utilizatorul, pe baza tipului de eroare. Arunca o privire la urmatorul exemplu, care demonstreaza aceasta tehnica:

 <?php 
 
// defineste-ti propriul handler de erori
set_error_handler('oops'); 
 
// initializeaza variabila $string
$string = 'a string'; 
 
// urmatorul rand va genera un avertisment 
explode($string); 
 
// handler-ul de erori
function oops($type, $msg, $file, $line, $context) { 
    switch ($type) { 
        // notificari 
        case E_NOTICE: 
            // nu face nimic 
            break; 
         
        // avertisment
        case E_WARNING: 
            // raporteaza eroarea
            print "Avertisment la linia $line din $file: $msg <br />"; 
            break; 
 
        // alte erori
        default: 
            print "Eroare $type la linia $line din $file: $msg <br />"; 
            break; 
    } 
} 
 
?>

Ia aminte la faptul ca anumite tipuri de erori nu pot fi gestionate in acest mod. De exemplu, o eroare fatala E_ERROR va preveni secventa de instructiuni de la a continua, si deci nu poate ajunge niciodata la un mecanism de gestiune a erorilor creat de utilizator. Vezi  http://www.php.net/set-error-handler pentru mai multe informatii pe aceasta tema.

Pagina:
1
comenteaza printeaza
Alte tutoriale PHP:
Noteaza acest tutorial
Rating tutorial
 
(1 voturi)
Pentru a nota acest tutorial, trebuie sa fii logat!
Posteaza un comentariu
Pentru a posta un comentariu, trebuie sa fii logat!
0 TOP UTILIZATORI* 0 0
Tutoriale scrise de claibornelara
claibornelara Rang utilizator claibornelara - Incepator
4330
Tutoriale scrise de mcuemica
mcuemica Rang utilizator mcuemica - Incepator
4195
Tutoriale scrise de ellarichards
ellarichards Rang utilizator ellarichards - Incepator
4180
Tutoriale scrise de kheops
kheops Rang utilizator kheops - Mediu
4084
Tutoriale scrise de emonclercheap
emonclercheap Rang utilizator emonclercheap - Incepator
4015
* Acest top reprezinta punctajele acumulate in ultimele 30 de zile.
Fireworks Outlook MySQL HTML Word Dreamweaver SEO JSON Bridge Java Powerpoint PSD Illustrator Python Excel SWF Gimp Sony Vegas Flash Ruby on Rails Javascript Swift 3D COREL DRAW XML PHP StyleSheet Photoshop Action Script Vista Fotografie Lightroom AJAX CSS RoR XHTML Verilog
Promovare:
Daca faci parte din comunitatea E-learn.ro si doresti promovarea acesteia, poti accesa pagina de promovare.
Arhiva newsletter:
Daca ai ratat un numar mai vechi, sau vrei sa revezi care au fost noutatile E-learn.ro la un moment dat, poti accesa arhiva de newslettere.
  Copyright © 2008-2013 E-LEARN.ro. Toate drepturile rezervate. Termeni si conditii.
Conceput si realizat de Neokinetics Software