• Acasă
  • Despre noi
  • Autori
  • Mărturii
  • Arhivă
  • Trimite Articol
  • Contact

WORLDIT

Lumea în 1 și 0.

  • Știri
    • Tehnologie
    • Tehnologie mobilă
    • Securitate
    • Developers
    • Știință
    • Benzi desenate
    • Jocuri
    • Intern
  • Tehnic
    • Browser
    • C#
    • C/C++
    • Challenge
    • HTML/CSS
    • Javascript, Ajax, jQuery
    • Open Source
    • PHP
    • Python
    • Securitate IT
    • Socializare
    • WordPress
    • Altele
  • Recenzii
  • Interviuri
  • Evenimente

Controlul iesirii in PHP – Output Buffering

0
  • Publicat de Andrei Avădănei
  • în Fără categorie
  • — 30 oct., 2009 at 10:00 am

uberblender[1]Utilizarea unei zone tampon pentru returnarea rezultatelor este o tehnica de programare care poate aduce avantaje aplicatiei in diverse cazuri. Controlul iesirii (sau Output Control ori Output Buffering) se refera la controlul informatiilor trimise de la server catre client. Este util de cele mai multe ori sa putem controla cum se vor trimite informatiile(de regula codul HTML generat) astfel incat pe parcursul generarii lui sa putem trimite alte diverse header-e.

Protocolul HTTP este un protocol de comunicare pe internet foarte des intalnit, mai ales in cadrul serverelor web. Apache este unul care implementeaza acest protocol la comunicarea cu clientii care fac diverse cereri acestuia. Anatomia sa presupune, atat la cerere cat si la raspuns, trimiterea unor header-e(prin care se vor specifica in ce fel sa fie interpretat mesajul ce urmeaza a fi trimis) si mesajul propriu-zis, care poate fi o cerere sau informatii formatate. Astfel, presupunand ca vrem accesarea site-ului google.com, browser-ul va trimite un mesaj de cerere catre webserver-ul respectiv cerand accesul la o pagina de pe server, in cazul nostru cea implicita. Serverul web va raspunde clientului cu un set de header-e prin care se va specifica ce tip de formatare va avea informatia ce urmeaza sa o primeasca, ce lungime are, ce codare de caractere trebuie sa foloseasca pentru a putea fi interpretata corect etc.

In cazul unui server pe care ruleaza PHP si in cazul in care serverul primeste o cerere pentru un fisier ce contine un script PHP, serverul va incepe sa trimita catre client informatiile odata cu:

  • intalnirea unui tag HTML
  • la orice apel al functiei echo, print, var_dump sau print_r
  • chiar la o linie goala intalnita in orice fisier php, chiar si intre blocurile de cod php
echo "Serverul Apache va incepe trimiterea de informatii din acest moment.";
?>

Corpul fisierului HTML generat pentru IP-ul

In exemplul de mai sus interpretorul de PHP va transmite serverului Apache sa inceapa trimiterea datelor catre client chiar de la instructiunea echo, si nu de la intalnirea tagului de marcarea a inceputului de document HTML cum ar fi fost normal. Sa presupunem insa ca, pentru fiecare accesare a acestui fisier, dorim sa retinem continutul returnat utilizatorului intr-un fisier pe server, desi pentru exemplul furnizat, motivatia acestei operatiuni este nu mai mult decat didactica. Vom folosi asadar functiile PHP pentru controlul iesirii, functii fare pot fi recunoscute usor dupa prefixul ob_.

ob_start();
echo "Serverul Apache va incepe trimiterea de informatii din acest moment.";
?>

Corpul fisierului HTML pentru IP-ul

$html = ob_get_contents();
$f = fopen('log.txt', 'w');
fwrite($f, $html);
fclose($f);
ob_end_flush()
?>

Functia ob_start marcheaza inceperea memorarii informatiilor generate de scriptul PHP fara insa a le trimite catre client. In orice moment al scriptului, inainte de trimiterea codului HTML generat, se pot accesa informatiile din zona tampon folosind functia ob_get_contents, lucru pe care l-am facut si noi pentru a stoca informatiile pe server. La final functia ob_end_flush va trimite informatiile generate catre client si va opri stocarea lor in zona tampon.

Serverul web are totusi niste header-e standard pe care le trimite odata cu fiecare cerere pe care o primeste. Din PHP aceste header-e se pot modifica sau se pot adauga folosind functia header. Cum aceasta functie va trimite direct header-ul catre client, ea trebuie apelata inainte ca orice continut sa fie trimis catre client, nerespectarea acestei reguli va genera un avertisment. Pentru a evita acest lucru se foloseste controlul iesirii.

Iesirea comprimata

Un avantaj al stocarii unei pagini web la server pana aceasta a fost generata complet este acela ca, in cazul unui volum mare de date transferat, acestea pot fi comprimate pentru a facilita transportul lui peste internet catre clientul care a facut cererea, obtinand astfel un timp mai bun de raspuns. Functia ob_start poate primi ca prim parametru numele unei functii care va fi aplicata asupra codului generat dupa ce acesta a fost generat complet. Astfel, functia ob_gzhandler a fost special creata pentru a comprima datele generate folosind formatul gzip. Urmatorul exemplu va dispune trimiterea de date comprimate catre client:

ob_start("ob_gzhandler");

O alta utilitate a acestei functii o reprezinta faptul ca atunci cand suntem nevoiti sa trimitem headerele dupa ce am permis afisarea informatiilor catre client vom primi o eroare : „Headers allready sent….” .
Adaugand pe prima linie a fisierului :

< ?php ob_start(); ?>

iar pe ultima

< ?php ob_flush(); ?>

va rezolva aceasta problema, deoarece el va pastra in memorie tot ce trebuie afisat catre client, va trimite toate headerele si abia la sfarsit va elibera memoria afisand.

Autor: George Enciu

Etichete: output bufferingoutput controlPHPTehnic

— Andrei Avădănei a scris 1246 articole

Andrei scrie pe worldit.info din vara lui 2011. Este fondatorul Asociatiei Centrul de Cercetare in Securitate Informatica din Romania - CCSIR si coordoneaza DefCamp, cea mai importanta conferinta de securitate informatica & hacking din Europa Centrala si de Est. Andrei ofera in cadrul Bit Sentinel servicii de securitate informatica, penetration testing, security management, recuperarea de pe urma unui atac cibernetic, training-uri si workshop-uri.

  • Articolul anterior Twitter phishing
  • Articolul următor Google Page Rank Update – 29 octombrie 2009

  • Facebook

    WorldIT.info
  • Ultimele Atacuri Cibernetice din Romania – RO Hacked

    [wp_rss_retriever url="https://rohacked.bit-sentinel.com/feed/" excerpt="none" items="5" read_more="false" new_window="true" thumbnail="false" cache="0"] RO Hacked este registrul atacurilor cibernetice din România.
  • Caută

  • Articole Recomandate

    • Recent Posts
    • Tags
    • Număr record de participanți la DefCamp 2015, cel mai important eveniment dedicat securității cibernetice din Europe Centrala si de Estdecembrie 2, 2015
    • La DefCamp 2015 vei afla prin ce tehnici pot fi evitate măsurile de securitate ale sistemelor informatice criticeoctombrie 16, 2015
    • Ultima sansa sa rezervi bilete de tip Early Bird la DefCamp 2015septembrie 1, 2015
    • 15 sfaturi despre cum poti deveni un programator bun venite de la specialisti romaniaugust 4, 2015
    • algoritmica Android antivirus Apple Avadanei Andrei benzi desenate BitDefender blog browser C++ Chrome concurs eveniment Facebook Firefox Google google chrome hacking html5 infografic informatica internet Internet Explorer IT javascript linux Microsoft Mozilla Firefox online PHP programare retea sociala review Romania securitate Tehnologie Twitter web Windows Windows 7 Wordpress WorldIT worldit.info Yahoo! YouTube
  • mai 2022
    L Ma Mi J V S D
     1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031  
    « dec.    
  • Link-uri Sponsorizate

    • laptop second hand

    • Calculatoare Second Hand

    • cod voucher pc garage

  • Home
  • Controlul iesirii in PHP – Output Buffering
  • Important

    • Bit Sentinel
    • Centrul de Cercetare în Securitate Informatică din România
    • DefCamp
  • Prieteni

    • BetiT.ro
    • bijuterii handmade
    • Computerica | Resurse gratuite PC
    • Descopera.org
    • Gadgeturi si IT – Giz.ro
  • Prieteni

    • PC – Config
    • RO Hacked
    • Stiri IT

Copyright © 2009-2014 WORLDIT. Toate drepturile Rezervate.
Termeni și condiții | Contact | Licența Creative Commons