<titlu>Depanarea scripturilor PHP</titlu>
<titlu>Scopuri</titlu> d4y4yx
• invatati sa distingeti erorile si defectele
• invatati sa depanati erorile gramaticale
• invatati sa remediati erorile la rulare
• invatati sa stabiliti cu precizie defectele software
Multi sunt de parere ca dezvoltarea programelor de calculator reprezinta cel
mai complex proces pe care l-a intreprins vreodata umanitatea, in
consecinta, nu trebuie sa mire pe nimeni faptul ca imperfectiunile rasei umane
joaca un anumit rol in dezvoltarea programelor. Programatorii trebuie
sa faca fata unei diversitati de surse de eroare, de manifestari si tipuri de
erori, aplicand o gama la fel de variata de instrumente si tehnici pentru
a purta razboiul cu erorile. Acest modul descrie erorile frecvent intalnite
de genul celor care apar in programele PHP, precum si tehnicile actuale
pentru descoperirea, stabilirea cu precizie si eradicarea erorilor.
<titlu>Depanarea si erorile comune de programare</titlu>
Depanarea este procesul de eliminare a hibelor de program, care reprezinta greseli
comise de programatori. Depanarea este diferita de testare, care consta in
analizarea unui program pentru a-i determina caracteristicile, cu precadere
numarul si gravitatea defectelor pe care le contine. Practica moderna a testarii
programelor este o disciplina complexa, care depaseste cadrul acestei carti.
Cititorul interesat in a afla mai multe despre testare este sfatuit sa
consulte cartea lui Boris Beizer Black-Box Testing: Techniques for Functional
Testing of Software and Systems* (Wiley, 1995) sau lucrarea lui Brian Marick
Craft of Software Testing: Subsystems Testing Including Object-Based and Object-Oriented
Testing"** (Prentice Hall, 1997).
Depanarea intra in scena atunci cand la testare apar simptome care
indica existenta unui defect. In general, depanarea implica
• Reproducerea simptomelor asociate hibei
• Stabilirea cu precizie a locatiei hibei
• intelegerea codului care contine hiba
<nota>
*In traducere Testarea de tip „cutie neagra": tehnici pentru
testarea functionala a programelor si a sistemelor-N.T.
**In traducere Arta testarii programelor: testarea subsistemelor, inclusiv
testarea bazata pe obiecte si testarea orientata spre obiecte — N.T. </nota>
• Remedierea hibei
• Testarea remedierii hibei si asigurarea ca nu au aparut alte hibe, ca
o consecinta a remediului
Sectiunea urmatoare, „Intelegerea hibelor", se concentreaza
asupra distingerii a numeroase tipuri de erori frecvent intalnite
si sugereaza metode de tratare a aces¬tora. O sectiune ulterioara a acestui
modul, in speta „Arta si practica depanarii", descrie in
detaliu procesul de depanare.
<remarca>
Din pacate, cuvantul hiba a ajuns sa faca referire la o notiune care poate
fi descrisa intr-un mod mai adecvat prin expresia defect software. De
exemplu, acelasi cuvant poate face referire la un caz minor de gripa*,
care nu s-a produs din vina nimanui si nu pune problema unor consecinte. Similar,
unii programatori denumesc defectele de program ca hibe, in incercarea
de a le reduce la minimum si de a se eschiva de responsabilitatea comiterii
sau remedierii acestora. Totusi, termenul a devenit atat de frecvent folosit,
incat utilizarea altuia poate cauza confuzie. </remarca>
<titlu>Intelegerea hibelor</titlu>
Cand un programator comite o greseala, atunci executa una sau mai multe
din urmatoarele actiuni:
• Omite liniile de program necesare
• Scrie linii de program inutile
• Scrie linii de program incorecte
Asa cum s-a aratat anterior, rezultatul este cunoscut sub numele de hiba software
sau hiba de program.
Dovezile privind existenta unei hibe pot fi obtinute la rularea programului.
Forma dominanta de testare a programelor, si anume testarea bazata pe executie,
implica rularea unui program cu intentia specifica de a gasi dovada existentei
unei hibe. La rularea unui program PHP, dovada existentei unei hibe ia, de regula,
una din urmatoarele forme:
• Un mesaj PHP care indica o eroare de sintaxa
• Un mesaj PHP sau al bibliotecii PHP care indica o eroare la rulare
• Date de iesire ale programului incorecte sau care lipsesc
Totusi, unele categorii de hibe nu prezinta asemenea dovezi. De exemplu, un
program cu hibe care contine linii de program inutile poate rula mai lent sau
mai putin eficient decat un program corect. Totusi, programul eronat poate
genera date
<nota>
*In jargonul calculatoarelor, bug inseamna, intr-adevar, hiba.
in limba engleza vorbita, bug mai inseamna si microb, la aceasta
dubla semnificatie se refera si autorul in cazul de fata. - N.T.
</nota>
de iesire, respectiv rezultate corecte. Se spune ca un asemenea program este
corect din punct de vedere functional, deoarece executa functia corecta, desi
o executa cu performante slabe. Aproape toate operatiile de depanare sunt orientate
spre reme¬dierea programelor incorecte din punct de vedere functional, nu
a programelor corecte sub acest aspect. Estimarea si imbunatatirea performantei
programelor corecte din punct de vedere functional constituie domeniul disciplinei
cunoscuta sub numele de evaluare a performantei programelor. Ca si testarea
programelor, evaluarea performantei programelor este o disciplina specializata.
Din pacate, disciplina de evaluare a performantei programelor este relativ putin
dezvoltata, deci nu putem recomanda cititorului interesat sa consulte o literatura
bine fundamentata referitoare la subiectul respectiv.
<titlu>Erori de sintaxa</titlu>
Cand interpretorul PHP incarca un program PHP, il analizeaza
pentru a determina daca programul se conformeaza regulilor gramaticale (sintactice)
ale limbajului PHP. De exemplu, interpretorul verifica ortografia cuvintelor
cheie si utilizarea oportuna a caracterelor de delimitare, precum virgulele
si caracterele punct si virgula. Daca programul nu se conformeaza gramaticii
limbajului PHP, interpretorul afiseaza un mesaj de eroare sintactica. De exemplu,
mesajul:
Parse error: parse error in test.php on line 3*
semnaleaza existenta unei erori de sintaxa.
Cunoscatorii altor limbaje de programare decat PHP nu vor asocia imediat
termenul de hiba cu notiunea de eroare sintactica. Multe limbaje de programare
impun programatorului sa pregateasca in mod special un program in
vederea executiei, efectuand un proces cunoscut sub numele de compilare.
Asemenea limbaje se numesc limbaje compilate; PHP si alte limbaje care nu necesita
compilare se numesc limbaje de scripting.
Desi necesita un oarecare volum de efort suplimentar din partea programatorului,
compilarea prezinta unele avantaje. In timpul compilarii, erorile de sintaxa
sunt descoperite si corectate. O data un program pregatit pentru executie, erorile
de sintaxa nu mai sunt posibile. Astfel, la rularea unui program scris intr-un
limbaj compilat nu se poate genera o eroare de sintaxa.
Un program scris intr-un limbaj de scripting poate genera erori de sintaxa
la rulare, in consecinta, in contextul respectiv, erorile de sintaxa
pot fi considerate hibe, mai ales cand cei care se confrunta cu acestea
sunt utilizatorii programului, nu programatorii.
<nota>
*In traducere: eroare de analiza: eroare de analiza in fisierul
test.php in linia 3 — N.T. </nota>
Cand interpretorul PHP raporteaza o eroare, acesta indica un numar de
linie. Este important sa intelegem ca numarul de linie semnalat nu precizeaza,
in general, linia care contine eroarea; este vorba despre numarul liniei
pe care interpretorul PHP o prelucra in momentul in care acesta
a sesizat existenta erorii, in consecinta eroarea de sintaxa se poate
afla pe linia indicata sau anterior acesteia.
Uneori, eroarea de sintaxa se poate gasi cu multe linii inaintea liniei
indicate, exemplu, programatorii neglijeaza deseori sa includa caracterul ghilimele
care inchide un sir de text. Intr-un asemenea caz, interpretorul
PHP poate considera liniile, care urmeaza dupa amplasamentul scontat al caracterului
ghilimele inexistent, ca facand de asemenea parte din sirul text. Cand
interpretorul PHP recunoaste, in sfarsit ca in program exista
o eroare, acesta poate indica spre o locatie amplasata la zeci sau chiar sute
de linii departare de pozitia efectiva a erorii.
Pentru a evita erorile de sintaxa, este bine sa va corectati programul. Mai
bine este sa cereti unei alte persoane sa va corecteze programul. Pentru a stabili
cu precizie pozitia erorilor de sintaxa, folositi tehnica divide et impera,
prezentata in sectiunea intitulata „Arta si practica depanarii".
<titlu>Mesaje de eroare la rulare</titlu>
O alta categorie de hibe PHP frecvent intalnite este indicata de
una sau mai multe mesaje de eroare la rulare. De exemplu, incercarea de
impartire la zero are rezultat un mesaj de eroare asemanator cu urmatorul:
Warning: Division by zero in test.php on line 2*
Acest mesaj este generat de interpretorul PHP, care este responsabil cu efectuarea
calculelor. Similar, incercarea de a deschide un server de baze de date
la o gazda nepotrivita poate duce la un mesaj de eroare asemanator cu urmatorul:
Warning: MySQL Connection Failed: Unknown MySQL Server Host ‘ dbhost
‘ (2) in test.php on line 3**
Acest mesaj este generat de biblioteca MySQL a limbajului PHP, care este responsabila
cu interfata cu serverele de baze de date MySQL. Alte biblioteci PHP genereaza
mesaje de eroare asociate operatiilor pe care le executa.
PHP genereaza patru nivele de mesaje de eroare, in ordinea crescatoare
a gravitatii, acestea sunt urmatoarele:
• Anunturi, care sunt trimise browserului numai daca folositi functia
error_reporting() pentru a specifica o sensibilitate la erori mai mare decat
nivelul normal
• Erori de analizor, care indica o sintaxa incorecta a programului
<nota>
*In traducere Avertisment: impartire la zero in fisierul test.php,
in linia 2 - N.T.
**In traducere Avertisment: Conexiune MySQL. ratata: Gazda necunoscuta
a serverului MySQL 'dbhost' in fisierul test.php, pe linia 3 - N.T.
</nota>
• Avertismente, care provin deseori din erorile de domeniu
• Erorile fatale, care determina incheierea executiei scriptului
De regula, mesajele de eroare sunt concepute pentru a veni in sprijinul
programatorilor. Pentru utilizatori, acestea sunt deranjante sau chiar mai rau.
De exemplu, un mesaj de eroare accidental poate afecta intr-o asemenea
masura continutul unui formular HTML generat de PHP, incat formularul
devine inutilizabil. Deci, in conditii normale, un program corect din
punct de vedere functional nu trebuie sa genereze mesaje de eroare.
Dar nu toate conditiile sunt normale. Nu este lipsit de sens ca un program sa
genereze asemenea mesaje de eroare in conditii neobisnuite. In absenta
mesajelor de eroare, reproducerea unei probleme sau determinarea cauzelor acesteia
sunt operatii dificile sau imposibile. Astfel, o buna parte din proiectarea
unei aplicatii consta in a determina circumstantele considerate „normale",
astfel incat mesajele de eroare sa poata fi excluse sub aceste circumstante,
dar permise in situatii speciale. Sfaturile rigide - de genul eliminarii
permanente a mesajelor de eroare prin prefi¬xarea numelor functiilor cu
simbolul „coada de maimuta" (@) - sunt simpliste si fara utilitate.
Sectiunea urmatoare, intitulata „Gestiunea erorilor in PHP",
prezinta numeroase tehnici pentru tratarea mesajelor de eroare PHP.
Majoritatea mesajelor de eroare la rulare sunt rezultate ale erorilor de domeniu,
in speta tentativelor de a aplica un operator sau o functie unei valori
necorespunzatoare. Impartirea la zero este o eroare de domeniu frecvent
intalnita. Puteti evita frecvent mesajele de eroare la rulare prin
simpla verificare a tipului si a valorii operanzilor si a argumentelor inainte
de a le folosi.
Cu toate acestea, dusa la extrem, o asemenea strategie are ca rezultat pro¬grame
de mari dimensiuni, ineficiente. O abordare mai rationala implica analiza riscurilor.
Trebuie sa verificati tipul si valoarea operanzilor si a argumentelor care pot
fi frecvent incorecte sau care pot duce la probleme grave. Ca regula empirica,
este important sa se verifice valorile introduse de utilizatori. In functie
de aplicatie, este importanta si verificarea valorilor provenite din fisiere,
baze de date sau surse externe.
PHP si alte limbaje de scripting prezinta probleme speciale, datorita tipurilor
dinamice. Multe limbaje de programare impun specificarea tipului variabilei
anterior utilizarii acesteia, iar apoi asociaza in mod permanent tipul
respectiv cu variabila. Aceste limbaje se numesc limbaje cu tipuri bine definite
(in original strongly typed languages). Deoarece tipurile variabilelor
sunt cunoscute si fixate la compilare, unele categorii de erori de domeniu pot
fi semnalate de compilatorul unui limbaj cu tipuri bine definite si implicit
evitate la rulare. Limbaje precum PHP, dar si numeroase alte limbaje de scripting,
se numesc limbaje cu tipuri slab definite (in original weakly typed languages).
Definirea slaba a tipurilor permite incepatorilor sa scrie programe care
functioneaza corect in majoritatea cazurilor. Cu toate acestea, definirea
slaba a tipurilor intarzie pana la momentul rularii recunoasterea
unor erori de domeniu, ceea ce ingreuneaza scrierea de programe cu inalta
fiabilitate.
<titlu>Date de iesire inexistente sau incorecte</titlu>
Un alt tip frecvent intalnit de hiba de program este semnalat atunci
cand un program produce date de iesire incorecte sau nu produce datele
de iesire asteptate. Asemenea hibe se numesc hibe logice, deoarece rezulta,
in general, dintr-o logica de program incorecta.
Logica de program implica trei elemente:
• Secventa. Este ordinea in care este executat programul
• Selectie. Reprezinta instructiunile care sunt executate si cele omise
datorita instructiunilor conditionale, cum este instructiunea if
• Iteratie. Numarul de executii ale instructiunilor sub controlul buclelor,
cum sunt buclele for
Evitarea in totalitate a erorilor din logica de program nu este omeneste
posibila Corectarea programului poate duce la descoperirea multor asemenea erori
si este procedeu recomandabil. Disciplina ingineriei software, care este destinata
a-i ajuta pe dezvoltatorii de programe sa creeze produse de inalta calitate,
a definit o tehnica numita inspectii software, care este o forma extrem de eficienta
de corectare a programelor. Pentru a invata mai multe despre acest procedeu,
consultati cartea lui Tom, Gilb Software Inspection (Addison-Wesley, 1993).
<Sfatul specialistului>
Intrebare: Am folosit limbaje de programare, precum Microsoft Visual Basic,
care includ un program de depanare. PHP contine un asemenea program?
Raspuns: PHP include un program de depanare in retea. Totusi, pro¬gramul
de depanare nu a fost inca portat la PHP 4. Pentru a depana un pro¬gram
PHP, puteti folosi procedeele descrise in sectiunea intitulata „Arta
si practica depanarii".
</Sfatul specialistului>
<Test „la minut">
• Cand PHP semnaleaza o eroare de sintaxa, unde se afla eroarea
efectiva in raport cu numarul de linie indicat?
• Cum se numeste o eroare relativa la valoarea sau tipul unui operand
sau al unui argument?
• Care este metoda de definire a tipurilor frecvent folosita de limbajele
de scripting, precum PHP? </Test „la minut">
<titlu>Gestiunea mesajelor de eroare in PHP</titlu>
Unele limbaje folosite pentru dezvoltarea in Web; cum ar fi ColdFusion,
Java si Python - furnizeaza mecanisme de tratare a exceptiilor. Mecanismele
de tratare a exceptiilor va permit sa scrieti programe care primesc automat
controlul la aparitia unei erori. Programele dumneavoastra de tratare a erorilor
pot, de exemplu, sa raporteze eroarea si sa incheie executia programului
sau pot incerca sa ocoleasca eroarea si sa-si continue executia.
In prezent, PHP nu dispune de mecanisme pentru tratarea exceptiilor, desi
aceasta este o caracteristica pe care multi programatori se asteapta sa o vada
adau¬gata, intr-un tarziu, in limbajul respectiv. Pana
atunci, aveti la dispozitie trei tehnici de baza pentru tratarea mesajelor de
eroare PHP:
• Evitarea conditiilor de eroare care ar genera, in caz contrar,
mesaje de eroare
• Suprimarea mesajelor de eroare
• Consemnarea in jurnal a mesajelor de eroare
Cele trei procedee vor fi descrise in sub-sectiunile urmatoare.
<titlu>Evitarea mesajelor de eroare<titlu>
Asa cum s-a explicat in sectiunea anterioara, multe mesaje de eroare PHP
reprezinta rezultatul unor erori de domeniu. Puteti evita asemenea mesaje de
eroare prin scrierea de programe care verifica valoarea si tipul operanzilor
si al argumentelor inainte de utilizarea acestora. Totusi, cand
detecteaza o valoare sau un tip inadecvat, programul dumneavoastra trebuie sa
rezolve situatia intr-un fel sau altul.
Un procedeu comun consta in stabilirea unei functii speciale pentru manipularea
erorilor. Cand programul detecteaza o eroare, invoca functia de tratare
a erorilor. La randul sau, functia de tratare a erorilor poate executa
oricare din urmatoarele operatii:
• Poate afisa un mesaj de eroare prietenos cu utilizatorul
• Poate consemna eroarea intr-un fisier sau intr-o baza de
date
• Poate incerca sa ocoleasca eroarea
<nota>
Raspunsuri la test:
• Pe linia respectiva sau anterior acesteia
• Eroare de domeniu
• Definire slaba</nota>
Centralizarea metodelor de tratare a erorilor intr-o asemenea functie
prezinta numeroase avantaje. De exemplu:
• Faciliteaza implementarea a numeroase moduri de raportare a erorilor
• Simplifica adaptarea mesajelor de eroare pentru mai multe limbi sau
localizari
Existenta mai multor moduri de raportare a erorilor va permite sa configurati
un program care sa produca mesaje de eroare in faza de dezvoltare a programului,
dar care sa le suprime in timpul operarii programului. Astfel, programatorii
pot bene¬ficia de informatiile incluse in mesajele de eroare, dar
utilizatorii pot evita aceste mesaje, care ii pot deruta sau stanjeni.
Similar, adaptarea unui program de asa natura incat sa furnizeze
mesaje orientate spre utilizator in mai multe limbi este mai simpla daca
o singura functie, respectiv grup de functii corelate, trateaza toate conditiile
de eroare. Mesajele orientate spre utilizator pot fi afisate intr-o locatie
bine determinata pe ecran, astfel incat sa nu afecteze functionarea
unei aplicatii. De asemenea, aceste mesaje pot include informatii codificate,
care ii ajuta pe programatori sa identifice si sa depaneze erorile. Astfel,
aceste mesaje pot furniza informatii echivalente celor continute in mesajele
de eroare PHP, fara a deruta sau devia atentia utilizatorului.
<titlu>Suprimarea mesajelor de eroare</titlu>
Deseori, suprimarea mesajelor de eroare constituie cea mai simpla modalitate
care se poate aplica. Dar, asa cum s-a explicat, aceasta metoda refuza programatorilor
accesul la informatii care ar putea ajuta la „deconspirarea" existentei
unei hibe sau la depanarea unei hibe cunoscute.
Mai mult, erorile PHP fatale determina incheierea executiei scriptului,
chiar daca mesajele de eroare sunt suprimate. Deci, in general este necesar
sa se testeze exis¬tenta conditiilor de aparitie a erorilor, chiar si atunci
cand mesajele de eroare sunt suprimate. Deseori, este doar putin mai dificil
sa se trateze conditia de aparitie a erorii folosind o functie de tratare a
erorilor, asa cum s-a aratat in sectiunea ante¬rioara, sau prin consemnarea
in jurnal a mesajelor de eroare, asa cum se va vedea in sectiunea
urmatoare.
Puteti suprima mesajele de eroare intr-unul din doua moduri. Pentru a
suprima mesajele de eroare in general, invocati functia error_reporting(),
care preia un argument ce specifica nivelul dorit de raportare a erorilor. Fiecare
nivel de eroare are o valoare integrala asociata:
<tabel>
*Nivel
*Valoare asociata
*Erori fatale
*E_ERROR
*Avertismente
*E_WARNING
*Erori de analizor
*E_PARSE
*Anunturi
*E_NOTICE
</tabel>
Argumentul transferat functiei error_reporting() este suma valorilor asociate
nivelurilor care urmeaza a fi raportate. De exemplu, o valoare a argumentului
egala cu E_ERROR+E_WARNING va determina PHP sa raporteze numai erorile fatale
si avertis¬mentele. O valoare a argumentului egala cu zero va determina
PHP sa nu raporteze nici o eroare.
Alternativ, puteti suprima mesajele de eroare asociate apelului la o anumita
functie. Pentru aceasta, prefixati numele functiei cu simbolul „coada
de maimuta"(@). De exemplu, urmatorul apel de functie nu va produce mesaje
de eroare:
$db = @mysql_connect(„localhost”);
Atunci cand mesajele de eroare sunt suprimate folosind oricare dintre
tehnicile prezentate, puteti dori sa obtineti acces la mesajul de eroare care
ar fi fost afisat in caz de neutilizare a procedeelor. Textul mesajului
este inclus in variabila speciala php_errormsg(). Puteti folosi valoarea
acestei variabile pentru a genera sau pentru a consemna in jurnal propriile
dumneavoastra mesaje de eroare.
<titlu>Consemnarea mesajelor de eroare</titlu>
Administratorul de sistem PHP poate configura PHP astfel incat sa
accepte consemnarea automata a mesajelor de eroare intr-un fisier jurnal
desemnat. Acesta este un obicei recomandat, deoarece evita imixtiunea mesajelor
de eroare in datele de iesire destinate utilizatorilor, dar in acelasi
timp captureaza mesajele de eroare, pentru a fi analizate de programatori.
Pentru a configura PHP astfel incat sa accepte consemnarea automata
a mesajelor de eroare, administratorul de sistem trebuie sa activeze urmatoarele
optiuni de configurare PHP in fisierul php.ini:
log_errors = On error_log = fisier
unde fisier precizeaza calea spre fisierul jurnal care urmeaza a fi utilizat.
In locul unui fisier, poate fi specificata in schimb valoarea speciala
syslog; aceasta valoare determina consemnarea mesajelor PHP folosind jurnalul
de sistem standard. Modi¬ficarile aduse acestei optiuni intra in vigoare
la urmatoarea pornire a serverului Web.
In afara de consemnarea automata a mesajelor de eroare, PHP poate consemna
manual mesajele de eroare specificate de functia error_log(). PHP4 accepta trei
forme ale acestei functii:
• Mesajele de eroare sunt consemnate conform celor specificate de articolul
de configurare error_log
• Mesajele de eroare sunt consemnate prin expedierea unor mesaje de e-mail
• Mesajele de eroare sunt consemnate prin scrierea intr-un fisier
specificat
Pentru a scrie un mesaj de eroare in jurnalul sistem PHP, invocati functia:
error_log(mesaj, 0)
unde mesaj specifica mesajul care va fi consemnat. De exemplu, instructiunea:
error_log(„Toate bune cu PHP.”, 0)
scrie mesajul „Toate bune cu PHP." la destinatia specificata de
articolul de configurare PHP error_log.
Pentru a expedia un mesaj de eroare prin intermediul postei electronice, invoc
functia:
error_log(mesaj, 1, destinatie)
unde mesaj specifica mesajul care va fi consemnat, iar destinatie indica adresa
de destinatie a mesajului de e-mail. De exemplu, instructiunea urmatoare trimite
un mesaj de eroare prin intermediul postei electronice:
error_log(„PHP functioneaza.”, 1, „bill@osborne.com”);
Daca trebuie sa specificari alte antete de mesaj, puteti folosi o forma conexa
a functiei:
error_log(mesaj, 1, destinatie, extra)
unde mesaj specifica mesajul care va fi consemnat, destinatie indica adresa
de destinatie a mesajului de e-mail, iar extra specifica antetele de mesaj suplimentare.
Pentru a scrie un mesaj de eroare intr-un fisier jurnal, invocati functia:
error_log(mesaj, 3, destinatie)
unde mesaj specifica mesajul care va fi consemnat, iar destinatie indica adresa
de destinatie a mesajului de e-mail. De exemplu, instructiunea urmatoare trimite
un mesaj de eroare intr-un fisier jurnal specific aplicatiei:
error_log(„A-Okay.”, 3, „/var/log/aplmea.log”);
Asa cum se poate observa, contul sub care ruleaza PHP trebuie sa aiba acces
de scriere in fisierul jurnal specificat.
<Sfatul specialistului>
Intrebare: Si daca doresc sa consemnez date, in locul mesajelor
de eroare? Are PHP aceasta posibilitate?
Raspuns: Puteti folosi optiunea functiei error_log() care permite consemnarea
intr-un anumit fisier pentru a scrie date arbitrare, nu doar mesaje de
eroare. Pur si simplu reprezentati datele pe care doriti sa le consemnati sub
forma unui sir si trans¬ferti sirul functiei error_log(), alaturi de codul
de destinatie (3) si de calea spre fisier jurnal. Puteti folosi aceasta tehnica
pentru a consemna accesele la parti ale sitului dumneavoastra Web, pentru a
crea jurnale de tranzactie, pentru a consemna conec¬tarile si deconectarile
utilizatorilor de la retea si pentru aproape absolut orice altceva. </Sfatul
specialistului>
<Test „la minut">
• Cum se numeste nivelul de mesaje de eroare PHP de maxima gravitate?
• Daca suprimati mesajele de eroare, este totusi posibil ca o eroare sa
determine incheierea executiei scriptului?
• Care este functia PHP folosita pentru scrierea mesajelor de eroare adaptate?
</Test „la minut">
<titlu>Arta si practica depanarii</titlu>
Aceasta sectiune prezinta unele dintre principiile si tehnicile aplicabile in
depanarea programelor. Asa cum o arata si titlul sectiunii, depanarea este mai
mult o arta decat o stiinta, in consecinta, depanarea este un proces
bazat pe oportunitate: nu conteaza care este cea mai buna metoda de depanare
a unui program, ci numai ca metoda respectiva sa dea rezultatul scontat. Existenta
unor abordari si a unor perspective suplimentare poate contribui la imbunatatirea
eficientei procesului de depanare.
Sectiunea de fata este organizata in jurul procesului de depanare specificat
anterior, care include urmatoarele operatii:
• Reproducerea simptomului
• Stabilirea cu precizie a hibei
• intelegerea hibei
• Remedierea hibei
• Testarea programului
Retineti ca operatiile sunt distincte de etapele prezentate. Operatiile pot
fi executate intr-o alta ordine, omise sau se pot chiar suprapune. Totusi,
in general, operatiile specificate se executa succesiv, iar expunerea
sugereaza unele motive pentru care omiterea unei operatii sau executarea acesteia
in afara secventei pot afecta eficacitatea procesului de depanare.
<titlu>Reproducerea simptomului</titlu>
Prima activitate din cadrul procesului de depanare este reproducerea, in
circumstante controlate, a simptomului sau simptomelor care indica existenta
hibei. Deseori, presupusele erori se dovedesc a fi o lipsa de intelegere
a modului de comportare a unui program sau mai degraba o eroare a utilizatorului,
nu a programatorului.
<nota>
Raspunsuri la test:
• Eroare fatala
• Da
• error_log()
Deci, este important sa incercati a reproduce simptomele pentru a verifica
probabilitatea de existenta a unei hibe.
Un al doilea motiv pentru reproducerea simptomului este acela ca, in caz
contrar, nu se poate demonstra ca hiba a fost remediata. Daca un simptom apare
rar si numai in conditii care nu sunt foarte bine intelese, s-ar
putea sa nu fie clar daca hiba a disparut sau doar se ascunde.
Multi programatori dau fuga la urmatoarea operatie, in speta stabilirea
cu precizie a hibei. Totusi, procesul de reproducere a simptomului poate furniza
indicii utile pentru stabilirea exacta a naturii hibei. De exemplu, este important
sa cunoastem conditiile in care apare simptomul, precum si circumstantele
in care acesta nu apare.
La reproducerea simptomului, este util sa dispunem de un raport complet si exact
al circumstantelor in care a fost observat simptomul, in caz contrar,
incercarea de a reproduce simptomul poate esua.
<titlu>Stabilirea cu precizie a hibei</titlu>
O data devenita posibila reproducerea in conditii de siguranta a simptomului
care indica existenta unei hibe, se poate incepe operatia de stabilire
cu precizie a hibei. In acest sens, doua procedee sunt deosebit de utile:
divide et impera* si urmarirea programului.
<titlu>Descoperirea defectelor cu ajutorul tehnicii divide et impera</titlu>
Tehnica divide et impera se bazeaza pe posibilitatea ca hiba sa fie localizata
intr-o anumita sectiune a programului, ceea ce constituie o caracteristica
specifica multor hibe, poate majoritatii hibelor care se gasesc in programele
PHP. Procedeul divide impera implica eliminarea liniilor de program selectate
si rularea programului. Daca simptomul persista, s-a demonstrat ca hiba se afla
in cealalta portiune a programului.
Procedeul divide et impera poate fi extrem de eficient. Daca o jumatate a programului
este eliminata la fiecare iteratie a acestei metode, o hiba care afecteaza o
singura linie dintr-un program cu 1000 de linii poate fi localizata prin numai
zece iteratii. Totusi, acest procedeu este rareori folosit pana la identificarea
unei singure linii de program, in schimb, este frecvent utilizat pentru
a detecta o functie cu defect. Daca functiile unui program au o lungime medie
de 25 de linii, un program cu 1000 de linii consta din 40 de asemenea functii.
Astfel, pentru identificarea functiei afectate vor fi necesare numai cinci sau
sase iteratii ale metodei divide et impera.
In mod caracteristic, liniile eliminate in cursul aplicarii procedeului
nu sunt eliminate din fisierul program; in schimb, sunt transformate in
comentarii. Cu alte cuvinte, sunt plasate marcaje de comentariu astfel incat
interpretorul PHP sa considere liniile eliminate ca fiind comentarii, nu linii
de program executabile.
<nota>
*Dicton latin: dezbina si stapaneste - N.T.</nota>
O complicatie la aplicarea procedeului divide et impera consta in faptul
ca exista corelatii intre componentele a numeroase programe, astfel ca
eliminarea unui program va cauza esuarea unei parti corespondente a programului.
In acest caz, se poate folosi o varianta speciala a procedeului divide
et impera, cunoscuta sub numele de racorduri si drivere (in original stubs
and drivers). Procedeul racorduri si drivere foloseste racordurile pentru a
aplica tehnica divide et impera unui program, iar driverele pentru a executa
celelalte componente ale programului.
Racord este termenul folosit pentru a desemna o functie intentionat incompleta.
A racorda o functie inseamna a inlocui functia cu un program care
afiseaza un mesaj sau care returneaza o valoare fixa, fara a executa o operatie
efectiva. De exemplu, iata un racord simplu ce poate inlocui o functie
care calculeaza radacina cubica a argumentului sau:
function radacina_cubica(x)
A echo “<BR>radacina_cubica() apelata cu argumentul $x”; return 1;
S
Remarcati ca functia racord returneaza intotdeauna valoarea 1. In general,
nu acesta este rezultatul matematic corect; totusi, este putin probabil ca valoarea
1 sa determine esecul functiilor care invoca functia radacina_cubica().
Prin driver se intelege o functie care apeleaza o alta functie, transferand
argumente speciale destinate a scoate la iveala hibele ascunse in cadrul
acesteia din urma. De exemplu, iata o functie driver care se poate folosi pentru
testarea unei functii numite patru() care calculeaza radacini de ordinul al
patrulea:
function driver($x)
A echo „<BR>Apeleaza functia patru() cu argumentul $x:”;
$y = patru($x); echo „<BR>Functia patru() a returnat rezultatul $y.”;
$z = $y * $y * $y * $y; if ($x == $z) echo „<BR>Rezultatul este corect.”; else echo „<BR>Rezultatul nu este corect.”;
S
<titlu>Urmarirea evolutiei unei variabile</titlu>
Deseori, verificarea modului de functionare a unui program este mai simpla daca
sunt disponibile rezultate intermediare. De exemplu, un program care determina
daca un numar dat este prim poate fi depanat mai usor daca se poate vedea care
au fost factorii testati.
Unele limbaje de programare includ utilitare de depanare care permit specificarea
unei optiuni ce determina afisarea linie cu linie a executiei programului. PHP
nu furnizeaza o asemenea caracteristica. Totusi, puteti folosi instructiuni
echo pentru a
afisa mesaje care prezinta evolutia unui proces de prelucrare a datelor si
valorile variabilelor importante.
Practica insertiei unor asemenea instructiuni intr-un program se numeste
instrumentarea programului. Unii programatori isi instrumenteaza programele
in faza de dezvoltare si nu elimina elementele de instrumentare nici macar
cand programele intra in faza de productie. De obicei, se folosesc
instructiuni if care suprima date de iesire instrumentate daca o variabila globala
- denumita deseori $debug (depa¬nare) sau ceva asemanator - nu are o anumita
valoare.
Acest obicei este deosebit de util in lucrul cu programe care s-au dovedit
a fi generatoare de probleme. Cand este necesara depanarea programului,
nu trebuie sa-l instrumentati, deoarece procedeul a fost deja aplicat.
<titlu>Intelegerea hibei</titlu>
Operatia urmatoare, adica intelegerea hibei, este cel mai frecvent neglijata
de catre programatori. Deseori, programatorii incep sa efectueze revizuiri
prin incercari, in speranta ca vor descoperi o corectie care va
remedia problema. O asemenea abordare aleatoare, de tip „invatare
din greseli", a procesului de depanare se dovedeste rareori oportuna, deoarece
programatorii care procedeaza astfel deseori introduc hibe noi in timp
ce incearca sa le remedieze pe cele vechi.
Este esential sa intelegeti natura hibei inainte de a incerca
sa o remediati. Daca programul este prea complicat pentru a fi inteles, acesta este un indiciu
ca procedeul divide et impera a fost abandonat prematur. Daca este necesar,
izolati instruc¬tiunea individuala „responsabila" cu hiba inainte
de a incerca sa o remediati. Majoritatea programatorilor - chiar si incepatorii
- sunt capabili de a intelege complet o instructiune separata de restul
programului.
<titlu>Remedierea hibei</titlu>
In general, remedierea hibei este cea mai simpla operatie din cadrul procesului
de depanare. Totusi, poate constitui si o oportunitate ratata. Deseori, o hiba
poate fi remediata in mai multe moduri. Nu alegeti pur si simplu prima
solutie la care v-ati gandit, ci incercati sa determinati si care
sunt celelalte remedii posibile. Apoi, dintre acestea, alegeti solutia cea mai
buna, nu neaparat pe prima.
<titlu>Testarea programului</titlu>
Operatia finala din cadrul procesului de depanare este cea mai importanta. Multi
programatori - mai ales incepatorii - isi revizuiesc programele
fara a verifica daca varianta revizuita rezolva efectiv problema. Verificarea
disparitiei simptomului este o componenta necesara a procesului de depanare.
Totusi, aceasta operatie nu este suficienta.
Deseori, in procesul de depanare, sunt introduse hibe noi. Este impor¬tant
sa verificati doua aspecte ale programului revizuit:
• Daca operatiile anterior imposibile sunt acum posibile
• Daca operatiile posibile anterior sunt si acum posibile
Satisfacerea ambelor criterii este dificila. O metoda consta in dezvoltarea
unor cazuri de test prin regresie pentru fiecare program. In acest context,
un test prin regresie este un test sau o serie de teste rulate la fiecare modificare
a unui program. Initial, este posibil ca setul de cazuri de teste prin regresie
sa nu fie foarte cuprin¬zator. Dar, daca se acumuleaza cazuri de test care
trateaza fiecare eroare care apare, setul de cazuri de teste prin regresie se
va dovedi, in cele din urma, util pentru evitarea hibelor care, in
cazul neutilizarii acestui procedeu, ar fi fost introduse in programul
difuzat pentru public. Disciplina de testare a programelor furnizeaza principii
utile pentru alegerea cazurilor de teste prin regresie; cititorul interesat
va consulta referintele specificate anterior.
<Sfatul specialistului>
Intrebare: N-am timp sa devin expert in testare. Nu avet i cateva sfaturi rapide privind modul de alegere a cazurilor de test?
Raspuns: O tehnica de testare utila se numeste partitionare prin echivalenta.
Acest procedeu porneste de la observatia ca multe cazuri de test sunt cruciale
in sensul ca, daca functioneaza, atunci vor functiona garantat si numeroase
alte cazuri de test conexe. Prin testarea unui numar maxim permis in practica
din aceste cazuri de test cruciale, testarea programelor devine mai eficienta
decat atunci cand cazurile de test sunt selectate in mod arbitrar.
O euristica utila pentru partitionarea prin echivalenta consta in testarea
unor valori mici, medii si mari pentru fiecare camp prelucrat de un program.
Pentru numere, testati valori pozitive, negative, respectiv egale cu zero. Pentru
campurile care apar in formularele HTML, testati valorile critice,
precum valorile asociate casetelor de validare, butoanelor radio si controalelor
de selectare.
Daca testati pur si simplu aceste valori pentru fiecare camp de introducere
a datelor, testarea programului efectuata de dumneavoastra va fi, probabil,
mai eficienta decat aceea executata de un programator mediu. </Sfatul
specialistului>
<Test „la minut">
• Care este prima operatie care trebuie executata in cadrul procesului
de depanare?
• Care este operatia din cadrul procesului de depanare cel mai frecvent
omisa de programatorii incepatori?
• Care este cea mai simpla operatie din cadrul procesului de depanare?
</Test „la minut">
<titlu>Proiect 17-1: Mesaje de eroare PHP</titlu>
In cadrul acestui proiect, veti vedea „la prima mana"
cum se comporta mesajele de eroare PHP. Veti folosi functia error_reporting()
pentru a specifica nivelul de raportare a erorilor si pentru a genera erorile
pe care le raporteaza sau le ignora, in functie de nivelul curent de raportare
a erorilor.
<titlu>Scopurile proiectului</titlu>
• Prezentarea modului de utilizare a functiei error_reporting()
• Prezentarea influentei exercitate de nivelul de raportare a erorilor
asupra modalitatii de raportare a mesajelor de eroare
<titlu>Pas cu pas</titlu>
1. Creati urmatorul script HTML, plasati-l intr-un fisier numit p17-1.php
si incarcati-l in serverul dumneavoastra PHP:
<HTML>
<HEAD>
<TITLTE>Proiect 17-1</TITLE>
</HEAD>
<BODY>
<?php echo „<BR>Utilizeaza raportarea standard a erorilor:”;
$x = $y;
$x = $ x / 0;
echo „<BR>Activeaza raportarea tuturor erorilor:”; error_reporting(15);
$x = $y;
$x = $ x / 0;
echo „<BR>Dezactiveaza raportarea erorilor:”; error_reporting(0);
$x = $y;
$x = $ x / 0;
echo „<BR><BR>Genereaza o eroare fatala:”;
$x = aceasta_functie_nu_este_definita();
echo „<BR>Ultima linie.”;
<nota>
Raspunsuri la test:
• reproducerea simptomului
• intelegerea hibei
• remedierea hibei</nota>
?>
</BODY>
<?HTML>
2. Studiati scriptul pentru a discerne elementele de structura a programului.
Veti identifica urmatoarele elemente:
• O sectiune de program care foloseste nivelul prestabilit de raportare
a erorilor
• O sectiune de program care foloseste nivelul cel mai detaliat de raportare
a erorilor
• O sectiune de program care suprima toate mesajele de eroare
• O sectiune de program care apeleaza o functie nedefinita si care executa
apoi o instructiune echo
Fiecare din primele trei elemente ale structurii include un program care genereaza
doua erori: o referinta la o variabila nedefinita si o impartire la zero.
Prima este considerata o eroare la nivel de anunt, iar ultima este o eroare
de nivel avertisment. Ultimul element al structurii apeleaza o functie nedefinita;
aceasta este considerata ca fiind o eroare fatala.
3. Orientati browserul dumneavoastra Web spre adresa URL asociata scriptului
PHP p17-1.php. Ecranul browserului va fi asemanator cu urmatoarea ilustratie:
<ecran>
Using default error reporting:
Warning: Division by zero in /home/bmccarty/public_html/php/module-17/debug.php
on line 12
Turning on all error reporting:
Warning Undefine variable: y in /home/bmccarty/public_html/php/module-17/debug.php
on line 17
Warning: Division by zero in /home/bmccarty/public_html/php/module-17/debug.php
on line 18
Turning off error reporting:
Generating a fatal error:
</ecran>
4. Observati ca:
• La nivelul prestabilit de raportare a erorilor, nu sunt afisate anunturile,
dar avertis¬mentele sunt afisate
• La nivelul cel mai detaliat de raportare a erorilor, sunt afisate atat
anunturile, cat si avertismentele
• Cand raportarea erorilor este suprimata, nu sunt afisate nici
anunturile, nici avertis¬mentele
• Cand raportarea erorilor este suprimata, nu sunt afisate nici
macar erorile fatale, desi acestea au ca rezultat incheierea imediata
a executiei programului, asa cum s-a aratat prin lipsa datelor de iesire ale
instructiunii echo finale
<Test de evaluare>
1. Care este numele tehnicii de depanare care implica si transformarea in
comentarii a unor sectiuni de program?
2. Include PHP 4 o functionalitate de depanare?
3. Care este variabila PHP ce include textul celui mai recent mesaj de eroare,
chiar daca raportarea erorilor este suprimata?
4. Cum se numesc erorile care incalca regulile gramaticale ale limbajului
PHP?
5. Ce se intampla la aparitia unei erori fatale, atunci cand
raportarea erorilor este suprimata? </Test de evaluare>