internetul Windows. Android

Configurarea jurnalelor în PHP. Mențineți fișierul fișierului jurnal Vizitatori fișierul jurnal php

Pe site-urile surround este ciudat să vezi când erorile sunt afișate utilizatorului în browser în cele mai neașteptate locuri. De ce apar - aceasta este o conversație separată. Dar de ce sunt derivate? La urma urmei, textul erorilor este informația pentru debag și este destinată dezvoltatorului și nu pentru client.

În plus, această informație de serviciu ajută, de obicei, hackerii răi să spargă site-ul. Ca exemplu clasic, puteți oferi o opțiune cu o ieșire de interogare în eroare: "Aveți o eroare în interogare în apropierea locului în care ID \u003d" Mulțumesc foarte mult. Înlocuim după "unde id \u003d ..." "șir" 0 sau 1\u003e 0 "și interogarea se efectuează de-a lungul întregii mese. Dacă cererea de eliminare, atunci ... înțelegi, distracție \u003d). Prin urmare, am încheiat întotdeauna variabile în citate. Doar în cazul în care...

Dar m-am dus departe. Astăzi nu este vorba despre asta. Astăzi vom vorbi despre modul de evitare a ieșirii de eroare a clientului, salvând toate mesajele către webmasterul pentru memorie.

Să începem, probabil, cu o scurtă viziune asupra tipurilor de erori din PNP.

Tabelul 1. Descrierea erorilor în PHP4 (lista originală)
Numeric
valoare
Constant Descriere Prins / nu.
1 E_error. Erori fatale. De exemplu, o eroare la accesarea memoriei. Execuția scriptului este întreruptă. nu
2 E_warning. Avertismente (nu erori fatale). Execuția scriptului nu este întreruptă. da
4 E_parse. Erori în timpul analizei de sintaxă. PARER este generat. nu
8 E_notice. Observații (erori mai puțin grave decât avertismente). Indicați situația care poate provoca o eroare mai gravă, dar poate fi, de asemenea, să se întâmple în timpul funcționării normale a scriptului. da
16 E_core_error. Erori în timpul descărcării PHR. Analog e_error este generat de miezul PNP. nu
32 E_core_warning. Avertismente în timpul descărcării PHR analog e_warning este generat de miezul PNP. nu
64 E_compile_error. Erori fatale în timpul compilării codului. Analog e_error este generat de motorul Zenda. nu
128 E_compile_warning. Avertismente în timpul compilării codului. Analog e_warning este generat de motorul Zandov. nu
256 E_user_error. Eroare personalizată. da
512 E_user_warning. Avertizare personalizată. da
1024 E_user_notice. Observație personalizată da

Suntem interesați de acele erori pe care le putem intercepta. Acestea includ: e_warning, e_notice și e_user_ *. Tipurile de interceptare a erorilor rămase nu sunt supuse nici datorate faptului că acestea au loc înainte de sfârșitul încărcării nucleului PNP în sine sau datorită faptului că acestea apar în stadiul analizei sintactice și compilarea codului PHR , astfel că concluzia lor va trebui să dezactiveze pur și simplu:

ini_set ("display_errors", 0);

Dar presupun că scripturile noastre sunt suficient de depuse astfel încât să nu aibă erori de sintactice elementare, așa că nu ar trebui să pierdem nimic.

În mod prestabilit, nivelul de eroare din PNP este e_all & ~ e_notice (sau 2039 în formă numerică), ceea ce înseamnă că vom sări peste urechile comentariilor, dar informăm despre toate celelalte erori.

Prin urmare, schimbați nivelul de ieșire al erorilor pe E_ALL:

Error_reporting (e_all);

Acum depășiți erorile de handicap și înlocuiți-ne funcția, ceea ce va fi angajat acum în erorile de procesare:

Set_error_handler ("user_log");

Luați în considerare această caracteristică mai mult. Ea este transmisă 5 parametri:

  • cod de eroare
  • text de eroare
  • numele fișierului în care a apărut o eroare
  • rând în fișier.
  • gama de variabile

Nu este obligat să returneze această caracteristică. Din moment ce vom vedea mai târziu eroarea de jurnal, atunci trebuie să înregistrați un jurnal, de exemplu, într-un fișier, astfel încât să vom lucra confortabil cu acesta.

\u003d (Log_file_maxze * 1024)) (// verificați setările dacă este instalat log_rotat, // apoi "Shift" fișiere vechi pe una în jos și creați un jurnal gol // dacă nu - curățați și scrieți în loc de vechiul log_rotate \u003d \u003d\u003d Adevărat) ($ i \u003d 1; // considerăm jurnalele vechi în directorul de timp (IS_File (log_file_name "." $ I)) ($ I ++;) $ i-; // fiecare dintre ele iau Rulează crește numărul 1 în timp ce ($ i\u003e 0) (redenumire (log_file_name ".." $ i, log_file_name. "." (1 + $ i--));) Rename (log_file_name, log_file_name ') * Verificarea dacă există un astfel de fișier dacă nu - putem să-l creăm dacă există - putem să-l scriem * / dacă (! IS_FILE (LOG_FILE_NAME)) (dacă (atingeți) (Log_File_name)) (Return "poate" T crearea fișierului jurnal ";)) altcinef (! Is_writable (log_file_name)) (return" poate scrie la fișierul jurnal ";) // Acordați atenție funcției pe care noi scriem jurnal. error_log ($ err_str, 3, log_file_name); )?\u003e.

Desigur, ar fi posibil să se utilizeze spațiul mai logic pentru astfel de scopuri - baza, dar, la urma urmei, greșelile, în cea mai mare parte, atunci când lucrează cu baza, așa că nu aș fi întemeiat pe ea.

De fapt, asta e tot. Restul, cred că nu va fi dificil pentru dvs., mai ales dacă utilizați funcții de fișier (); & explodează (); . Și dacă încă mai faci, poți folosi [acest cod].

Anticipând întrebarea "De ce nu am folosit CSV, care pare să fie utilizată în mod logic în această situație?", Răspuns: Mesajele de eroare pot conține un număr necunoscut de caractere de service (AKA virgule și punct și virgulă), ceea ce ar face clar dificil pentru a disambla CSV. Da, și nu voi naviga la log în Excel.

Mai multe gânduri diferite pe această temă:

  • dacă jurnalul GZ este depășit pentru a avea un fișier și a o plia în arhivă;
  • la fel, dar cu pachetul prin poștă;
  • În cazul erorilor critice - Mail (consultați un exemplu dintr-un manual pentru funcția

În fiecare realitate PHP. Aplicații Din când în când există erori și excepții, exprima avertismente, mesaje. Dacă nu suntem atenți să înregistram aceste informații (logare), atunci la un moment bun, va fi imposibil să înțelegeți că aceste erori și excepții apar în ce parte a cererii și, în consecință, nu vom putea să le rezolvăm. În plus, există astfel de situații în care logarea evenimentelor, acțiunile pur și simplu necesare, ca în cazul intrării utilizatorului în sistem și de ieșire din acesta, de exemplu.

ÎN PHP există deja instrumente necesare pentru jurnalizare: Funcția. error_log () - Pentru a trimite un mesaj în jurnalul de sistem, caracteristică set_error_handler (), Pentru a intercepta avertismentele și erorile. Aceste funcții pot fi utilizate pentru gestionarea erorilor de utilizator, oferind un dezvoltator de cod posibilitatea autocontrolării logicii de procesare și filtrarea erorilor.

Cu toate acestea, un astfel de acces la nivel scăzut duce la dublarea frecventă a codului și, mai important, un astfel de cod este mai predispus la erori. Prin urmare, componentele gata făcute ajung la ajutorul programatorului, bine testat și dovedit în condițiile "Combatere".

Astfel de componente se referă la zend-log de freameki Zend.. Componenta zend-log. Poate fi folosit ca o componentă multifuncțională de logare, un fel și stăpânul tuturor mâinilor. Acesta acceptă o varietate de formate de logare și soiuri de baze de date (fișiere, baze de date), plus are un sistem de filtrare a mesajului dezvoltat și mult mai mult. De asemenea zend-log. Compatibil S. PSR-3. Standardul de înregistrare. Instalat astfel:

Compozitorul necesită Zendframework / Zend-log

Se utilizează după cum urmează (de exemplu, fișierul index.php este utilizat în rădăcina proiectului):

Necesită "vânzător / autoload.php";

Utilizați Zend \\ log \\ logger;
Utilizați Zend \\ log \\ scriitor \\ stream;

$ Logger \u003d noul logger;

// trimite erori la consola
$ scriitor \u003d flux nou ("php: // oouput");

$ Logger -\u003e Addwriter ($ scriitor);
$ Logger -\u003e Log (logger :: info, "unele informații");

Rezultatul codului este mai mare:

2017-09-26T10: 40: 34 + 03: 00 Info (6): Unele informații

Șirul final include ora evenimentului, prioritatea și mesajul. Formatul mesajului afișat va fi cu siguranță modificat dacă este necesar, utilizând metoda setformatter (). În mod implicit, șirul de log este descris de următorul șablon:

% Timestamp %% PrioritateName% (% Prioritate%):% Mesaj %% Extra%

  1. % Timestamp% este o marcaj de timp
  2. % PrioritateName% - Prioritatea etichetei text
  3. % Prioritate% - Prioritatea etichetei de număr
  4. % Mesaj% - Mesaj
  5. % Extra% - Valoare opțională pentru informații suplimentare

Dacă doriți să modificați formatul de mesaje, acest lucru se face după cum urmează:

$ Formator \u003d Noua Zend \\ log \\ formatter \\ simplu (mesajul% mesaj% ". PHP_EOL);
$ Scriitor -\u003e setformatter ($ formator);

Componenta zend-log. De asemenea, poate fi utilizat pentru a înregistra erori și a excepțiilor interpretului PHP. Pentru a face acest lucru, în clasa loggerilor, există încă două metode statice: Logger :: Regisererrorhandler ($ logger) - să intercepteze greșelile și Logger :: RegisterexceptionHandler ($ logger) - să intercepteze excepțiile.

Utilizați Zend \\ log \\ logger;
Utilizați Zend \\ log \\ scriitor;

$ Logger \u003d noul logger;
$ Scriitor \u003d nou scriitor \\ stream (__ dir__. "/Test.log");
$ Logger-\u003e Addwriter ($ scriitor);

// erorile de înregistrare
Logger :: RegistereRerorHandler ($ logger);

// Excepții de înregistrare
Logger :: RegisterExceptionHandler ($ logger);

Ca menționat mai devreme, zend-log. Ne oferă posibilitatea de a filtra mesaje pentru logare, adică Înainte de a înregistra un mesaj într-un jurnal, putem urmări dacă satisface criteriile noastre și dacă da, apoi scrieți.

Iată un exemplu:

$ Filtru \u003d Noua Zend \\ log \\ filtru \\ Prioritate (logger :: crit);

// metoda addfilter scriitor
$ Writer-\u003e addfilter ($ filtru);

În acest exemplu, ne vom conecta numai la acele mesaje a căror prioritate este mai mică sau egală cu critica ( Logger :: crit.).

O listă completă a priorităților definite în sala de clasă Zend \\ log \\ logger:

Const emer \u003d 0; // Accident: Sistemul nu este potrivit pentru utilizare
Const alert \u003d 1; // anxietate: nevoie urgentă de a lua măsuri
Const crit \u003d 2; // Situatie critica
const err \u003d 3; // eroare.
Const warn \u003d 4; // Un avertisment
Const notificare \u003d 5; // Atenție
Const info \u003d 6; // Informație
const depan \u003d 7; // Debag, Debug

De asemenea, putem filtra mesaje bazate pe expresii regulate, etichete temporare etc. În acest fel, conectarea la PHP. - Este un lucru important și uneori necesar atunci când se dezvoltă aplicații web.

Pe Internet există un număr mare de servicii care oferă servicii pentru participarea contabilă a site-ului dvs. Aceste servicii sunt furnizate atât pentru platite, cât și gratuite. De exemplu, puteți aduce LiveInternet. Acest serviciu este destul de larg pe Internet și aproape fiecare site își utilizează serviciile. Proprietarul are statistici detaliate privind vizitarea site-ului său.

Nu există nici o dispută! Aceste servicii sunt indispensabile în luarea în considerare a participării la fața locului și a studiului suplimentar al comportamentului utilizatorilor. Dar în acest articol vreau să spun cum să fac un fișier jurnal de fișiere pe server.

Vizite de fișiere jurnal

Acest fișier jurnal va fi foarte util, pentru a ține cont de vizite și vizualizări de către vizitatorii site-ul dvs. Web. Pentru a crea un fișier jurnal, utilizați un script scris în PHP. Scriptul este destul de simplu în înțelegerea și instalarea pe site.

PHP Script pentru a crea fișierul jurnal

Scriptul înregistrează timpul exact al site-ului, definește browserul vizitatorului și cel mai important - determină de unde a venit vizitatorul. Un fișier jurnal de intrare are loc de fiecare dată când este afișată pagina site-ului. Adică proprietarul site-ului poate vedea în fișierul jurnal care a analizat în mod specific vizitatorul paginii site-ului pe o anumită ip și timp utilizând un anumit browser.

Afișarea scriptului de înregistrare a datelor în fișierul jurnal

Instalarea scriptului

Salvați scriptul în șablon sau în fișierul de utilizatori externi. Pentru a introduce scriptul la pagină, utilizați următorul cod.

Conectarea în PHP se înțelege ce tipuri de erori vă vor spune aplicația dvs. web / sit / scriptul PHP și cum.

Există 2 (3) metoda principală de obținere a erorilor din cerere:

  1. Ieșirea acestor erori direct pe ecran
  2. Înregistrați aceste erori într-un fișier de jurnal special
  3. sau imediat ambele opțiuni: ieșirea acestor erori pe ecran și le scrie într-un fișier de jurnal special

De regulă, se practică că atunci când se dezvoltă (pe un mediu local), toate erorile sunt arătate direct pe ecran, astfel încât acestea să fie mai ușoare și mai repede capturate și corectate, iar într-un mediu de luptă (pe producție) erorile nu sunt Afișat deloc (deoarece pentru utilizator este informații inutile) și toate informațiile despre ele sunt scrise în fișierul jurnal pe care dezvoltatorul îl scanează în mod regulat.

Setări pentru înregistrarea erorilor

  1. raportarea erorii - Acesta este parametrul principal. Este responsabil pentru ce tipuri de mesaje de eroare vor fi afișate / gropi în fișierul jurnal. Cred că există doar 2 opțiuni care pot fi utilizate:
    • -1 (sau e_all) - raportat pe toate tipurile de erori;
    • 0 - Nu a raportat niciun tip de erori

    Vă recomandăm să utilizați exclusiv -1 (sau e_all).
    pentru că Cererea nu ar trebui să aibă nicio eroare, în principiu. Această opțiune poate fi setată prin fișierul de configurare din PHP.ini sau direct în scriptul PHP, apelând funcția raportarea erorii:

    Error_reporting (-1); Error_reporting (e_all);

    Apropo, aceasta este singura opțiune care este în limba PHP sub forma unei funcții. Toate celelalte opțiuni pot fi setate exclusiv utilizând editarea fișierelor de configurare PHP.ini sau apelurile funcției iNI_SET () Trecerea la acesta, respectiv, parametrul și valoarea necesară pentru aceasta.

  2. display_errors. - Acest parametru este responsabil pentru emisiunea imediată a erorilor de pe ecran după ce sa întâmplat de fapt. Acest parametru poate fi 0 sau 1 sau ON / OFF. Acestea. Sau să afișeze erorile pe ecran sau nu.
  3. display_startup_errors. - Această opțiune este responsabilă pentru afișarea erorilor care au avut loc după începerea PHP. De exemplu, dacă există o eroare de sintaxă în fișierul de configurare, atunci vor fi afișate informații despre acesta. Acest parametru poate fi 0 sau 1 sau ON / OFF.
  4. log_errors. - Prezenta directivă este responsabilă pentru înregistrarea mesajelor de eroare în fișierul jurnal. Acest parametru poate fi 0 sau 1 sau ON / OFF. Acestea. Înregistrați erorile în jurnal sau nu.
  5. error_log. - această setare este responsabilă pentru calea către fișier (fișier jurnal), la care toate erorile de aplicație care au avut loc
  6. hTML_ERRORS. - Aceeași opțiune este responsabilă pentru formatul afișării erorii de aplicație. Dacă este setat ca 1 sau ON, eroarea va fi afișată utilizând HTML, adică Va exista o urmă de origine a erorii și totul va fi destul de informativ și colorat. Dacă valoarea acestei setări este specificată ca 0 sau OFF, atunci erorile vor fi afișate ca un text convențional ca un număr mic de rânduri.

1. Setări pentru afișarea erorilor pe ecran




INI_SET ("HTML_ERRORS", 1);
INI_SET ("log_errors", 0);

2. Setări pentru scrierea erorilor în fișierul jurnal

Error_reporting (-1); // ini_set ("error_reporting", -1);
ini_set ("display_errors", 0);
INI_SET ("DISPLAY_STARTUP_ERRORS", 0);
INI_SET ("LOG_ERRORS", 1);

3. Setări pentru afișarea simultană a erorilor și le scrieți în fișierul jurnal

Error_reporting (-1); // ini_set ("error_reporting", -1);
INI_SET ("display_errors", 1);
INI_SET ("DISPLAY_STARP_ERRORS", 1);
INI_SET ("LOG_ERRORS", 1);
INI_SET ("HTML_ERRORS", 1);
ini_set ("error_log", "/var/log/php/error.log");

De asemenea, aceste opțiuni pot fi setate în fișierul de configurare PHP.ini sau în fișierul gazdei dvs. virtuale.