Računala Windows Internet

Izrada html stranica s PHP-om. Koja je razlika između php datoteke i html datoteke Što trebate znati

Cameron Laird

PHP ne podržava obradu tokova. Bez obzira, i suprotno mišljenju većine PHP programera s kojima sam razgovarao, PHP aplikacije mogu obavljati više zadataka. Počnimo s otkrivanjem što "multitasking" i "threading" znače za PHP programiranje.

Raznolikost paralelizma

Prvo, ostavljamo po strani slučajeve koji su izvan glavne struje glavne teme. PHP ima složen odnos s multitaskingom ili istodobnošću. Na najvišoj razini PHP je stalno uključen u multitasking - standardne PHP instalacije na poslužitelju (poput Apache modula) koriste se na način koji obavlja više zadataka. Odnosno, više klijentskih aplikacija (web preglednika) može zatražiti istu PHP stranicu u isto vrijeme, a web poslužitelj će je vratiti svima manje-više u isto vrijeme.

Jedna web-stranica ne blokira prijenos druge, iako mogu malo ometati jedna drugu kada se bave ograničenim resursima kao što su memorija poslužitelja ili propusnost mreže. Stoga, zahtjevi sustava za istodobnost mogu omogućiti rješenja temeljena na PHP-u. U smislu implementacije, PHP smatra web poslužitelj odgovornim za istodobnost.

Paralelizam na strani klijenta nazvan Ajax također je privukao pozornost programera u posljednjih nekoliko godina. Iako je značenje Ajaxa postalo pomalo nejasno, jedan aspekt ove tehnologije je da preglednik može izvoditi izračune u isto vrijeme i ostati osjetljiv na radnje korisnika kao što su odabiri izbornika. To je stvarno vrsta multitaskinga. PHP kodirani Ajax to čini, ali bez ikakvog posebnog uključivanja PHP-a; Ajax okviri za druge jezike rade na isti način.

Treći primjer istodobnosti koji samo zagrebe površinu PHP-a je PHP / TK. PHP / TK je PHP proširenje koje pruža prijenosno grafičko korisničko sučelje (GUI) vezanje za PHP jezgru. PHP / TK vam omogućuje stvaranje desktop GUI aplikacija napisanih u PHP-u. Njegovi aspekti vođeni događajima simuliraju oblik istodobnosti koji je lako naučiti i koji je manje sklon pogreškama od rada s nitima. Opet, istodobnost je "naslijeđena" od komplementarne tehnologije, a ne od temeljne PHP funkcionalnosti.

Bilo je nekoliko eksperimenata za dodavanje podrške niti u sam PHP. Koliko ja znam, niti jedan nije bio uspješan. Međutim, Ajax i PHP/TK okviri vođeni događajima pokazuju da događaji mogu čak bolje izraziti istodobnost za PHP nego što to mogu niti. PHP V5 to dokazuje.

PHP V5 nudi stream_select ()

U standardnom PHP V4 i ranijim verzijama, sav posao PHP aplikacije mora se obavljati uzastopno. Ako program treba dohvatiti cijenu artikla s dvije komercijalne stranice, na primjer, traži prvu cijenu, čeka odgovor, traži drugu cijenu i ponovno čeka.

Što ako bi program mogao obavljati više zadataka u isto vrijeme? Bio bi dovršen u samo djeliću vremena potrebnog za dosljedan rad.

Prvi primjer

Nova funkcija stream_select, zajedno s nekoliko svojih prijatelja, pruža ovu mogućnost. Razmotrimo sljedeći primjer:

0) ($ s = stream_socket_client ("phaseit.net:80", $ errno, $ errstr, $ timeout, STREAM_CLIENT_ASYNC_CONNECT / STREAM_CLIENT_CONNECT); if ($ s) ($ utičnice [$ id ++] = $ s; $ http_mess = " GET / demonstracija / kašnjenje? Delay = ". $ Odgoda." HTTP / 1.0 \ r \ nHost: phaseit.net \ r \ n \ r \ n "; fwrite ($ s, $ http_message);) else (echo " Stream ". $ id." nije se ispravno otvorio. ";) $ kašnjenje - = 3;) while (broj ($ utičnice)) ($ čitanje = $ utičnice; stream_select ($ čitanje, $ w = null, $ e = null , $ timeout); if (count ($ read)) (/ * stream_select obično miješa $ read, tako da moramo shvatiti iz kojeg socketa čita. * / foreach ($ čita se kao $ r) ($ id = array_search ($ r, $ sockets); $ data = fread ($ r, $ povoljno_read_block); / * Socket se može čitati ili zato što ima podatke za čitanje ILI zato što je u EOF stanju. * / if (strlen ($ data) = = 0) (echo "Stream". $ Id. "Zatvara se u". Datum ("h: i: s"). ". \ N"; fclose ($ r); poništeno ($ sockets [ $ id]); ) ostalo ($ rezultat [$ id]. = $ podaci;))) ostalo (/ * Ty maut znači da * sve * niti nisu čekale odgovor. * / echo "Istek! \ n"; pauza; ))?>

Ako pokrenete ovaj program, vidjet ćete informacije slične sljedećim:

Program počinje u 02:38:50 sati. Stream 4 se zatvara u 02:38:53. Stream 3 se zatvara u 02:38:56. Stream 2 se zatvara u 02:38:59. Stream 1 se zatvara u 02:39:02. Stream 0 se zatvara u 02:39:05.

Važno je razumjeti što se ovdje događa. Na visokoj razini, prvi program postavlja nekoliko HTTP zahtjeva i prima stranice koje mu web poslužitelj šalje. Iako bi prava aplikacija vjerojatno zahtijevala nekoliko različitih web poslužitelja (možda google.com, yahoo.com, ask.com, itd.), ovaj primjer prosljeđuje sve zahtjeve našem korporativnom poslužitelju na Phaseit.net samo da bi se smanjila složenost. ...

Zatražene web stranice vraćaju rezultate nakon dolje prikazane varijable kašnjenja. Ako bi program izvršavao zahtjeve uzastopno, trebalo bi oko 15 + 12 + 9 + 6 + 3 (45) sekundi da se dovrši. Kao što je prikazano u Listingu 2, zapravo je potrebno 15 sekundi da se završi. Trostruka produktivnost je izvrstan rezultat.

To je omogućeno stream_select, novom značajkom u PHP V5. Zahtjevi se iniciraju na uobičajen način - otvaranjem nekoliko stream_socket_clients i pisanjem GET za svaki od njih, što odgovara http://phaseit.net/demonstration/delay?delay=$DELAY. Kada zatražite ovaj URL u svom pregledniku, trebali biste vidjeti:


Iako je posebna implementacija u Listingu 3 za UNIX®, gotovo sve skripte u ovom članku jednako se dobro primjenjuju na PHP instalacije na Windows® (osobito nakon Windows 98) ili UNIX. Konkretno, možete raditi s Listingom 1 na bilo kojem operacijskom sustavu. Linux® i Mac OS X su okusi UNIX-a, a sav kod ovdje će raditi na oba sustava.

Zahtjevi poslužitelja za kašnjenje izrađuju se sljedećim redoslijedom:

kašnjenje = 15 kašnjenje = 12 kašnjenje = 9 kašnjenje = 6 kašnjenje = 3

Cilj stream_selecta je dobiti rezultate što je brže moguće. U ovom slučaju, redoslijed kašnjenja je suprotan redoslijedu kojim su zahtjevi podneseni. Nakon 3 sekunde, prva stranica je spremna za čitanje. Ovaj dio programa je normalan PHP kod - u ovom slučaju s freadom. Baš kao u drugom PHP programu, čitanje se može obaviti s fgetovima.

Obrada se nastavlja na isti način. Program se blokira na stream_select dok podaci ne budu spremni. Ključno je da počne čitati čim bilo koja veza ima podatke, bilo kojim redoslijedom. Ovako program implementira multitasking ili paralelnu obradu rezultata višestrukih upita.

Imajte na umu da nema dodatnog opterećenja CPU-a na glavnom računalu. Nije neuobičajeno da mrežni programi uskoro izvrše fread na ovaj način kako bi iskoristili 100% CPU-a. Ovdje to nije slučaj, budući da stream_select ima željena svojstva i reagira odmah čim je bilo kakvo čitanje moguće, ali također minimalno opterećuje CPU u stanju pripravnosti između čitanja.

Što trebate znati o stream_select ()

Ovo programiranje temeljeno na događajima nije trivijalno. Iako je Popis 1 sveden na osnovne stvari, svako kodiranje koje se temelji na povratnim pozivima ili koordinaciji (što je neophodno u aplikacijama s više zadataka) bit će manje poznato od jednostavnog proceduralnog slijeda. U ovom slučaju, najveća poteškoća leži u nizu $ read. Imajte na umu da je ovo poveznica; stream_select vraća važne informacije mijenjajući sadržaj $ read. Baš kao što pokazivači imaju reputaciju kao stalni izvor grešaka u C-u, čini se da su reference najteži dio PHP-a za programere.

Ova tehnika upita može se koristiti s bilo kojeg broja vanjskih web stranica, osiguravajući da program primi svaki rezultat što je brže moguće bez čekanja na druge zahtjeve. Zapravo, ova tehnika ispravno radi sa bilo kojom TCP/IP vezom, a ne samo s webom (port 80), odnosno, u principu, možete kontrolirati ekstrakciju LDAP podataka, SMTP prijenos, SOAP zahtjeve itd.

Ali to nije sve. PHP V5 obrađuje različite veze kao "streamove", a ne kao jednostavne utičnice. PHP Client URL Library (CURL) podržava HTTPS certifikate, odlazne FTP prijenose, kolačiće i još mnogo toga (CURL omogućuje PHP aplikacijama korištenje različitih protokola za povezivanje s poslužiteljima). Budući da CURL pruža stream sučelje, veza je transparentna s programske točke gledišta. Sljedeći odjeljak objašnjava kako stream_select multipleksira čak i lokalno računanje.

Postoji nekoliko upozorenja s stream_select. Ova funkcija nije dokumentirana, tako da nije pokrivena čak ni u novim knjigama o PHP-u. Nekoliko primjera kodova dostupnih na webu jednostavno ne funkcioniraju ili nisu razumljivi. Drugi i treći argument za stream_select, koji kontroliraju kanale za upisivanje i iznimke koji odgovaraju kanalima za čitanje u Listingu 1, trebali bi gotovo uvijek biti null. Uz nekoliko iznimaka, odabir ovih kanala je pogreška. Ako niste dovoljno iskusni, koristite samo dobro opisane opcije.

Također, čini se da stream_select ima greške, barem u PHP V5.1.2. Najvažnije je da se povratnoj vrijednosti funkcije ne može vjerovati. Iako još nisam otklonio pogreške u implementaciji, moje iskustvo je pokazalo da je sigurno testirati count ($ read) kao u Listingu 1, ali to se ne odnosi na povratnu vrijednost samog stream_select, unatoč službenoj dokumentaciji.

PHP Lokalna konkurentnost

Primjer i većina gornje rasprave usredotočeni su na to kako upravljati više udaljenih resursa u isto vrijeme i dobiti rezultate kako se pojave, umjesto da čekate da se svaki od njih obradi redoslijedom izvornog zahtjeva. Ovo je nesumnjivo važna primjena PHP konkurentnosti. Ponekad se stvarne aplikacije mogu ubrzati deset puta ili više.

Što ako se usporavanje dogodi bliže? Postoji li način da se ubrza dobivanje rezultata u PHP-u pri lokalnoj obradi? Nekoliko ih je. Oni su možda čak i manje poznati od pristupa orijentiranog na socket u Popisu 1. Postoji nekoliko razloga za to, uključujući:

  • Uglavnom, PHP stranice su dovoljno brze. Bolja izvedba mogla bi biti prednost, ali ne dovoljna da opravda ulaganje u novi kod.
  • Korištenje PHP-a na web stranicama može učiniti djelomično ubrzanje koda nevažnim. Preraspodjela računanja radi bržeg dobivanja međurezultata je irelevantna kada je jedini kriterij brzina isporuke web stranice u cjelini.
  • Nekoliko lokalnih uskih grla kontrolira PHP. Korisnici se mogu žaliti da je potrebno 8 sekundi da se dohvate podaci o računu, ali to može ograničavati obradu baze podataka ili nekog drugog resursa izvan PHP-a. Čak i ako smanjite vrijeme obrade PHP-a na nulu, samo pretraživanje će i dalje trajati više od 7 sekundi.
  • Još manje ograničenja pogodno je za paralelnu obradu. Pretpostavimo da određena stranica izračunava preporučenu cijenu za uvrštenu običnu dionicu, a izračuni su dovoljno složeni i za dovršetak im je potrebno mnogo sekundi. Računanje može biti sekvencijalno po prirodi. Ne postoji očit način da ga distribuirate za "suradnju".
  • Malo PHP programera razumije PHP potencijal za paralelnu obradu. Kad smo govorili o mogućnosti paralelizacije, većina programera koje sam upoznao jednostavno je citirala frazu "PHP ne radi s nitima" i vratila se na svoj ustaljeni model računanja.

Ponekad možete bolje. Pretpostavimo da PHP stranica treba izračunati dvije cijene dionica, možda ih usporediti, a glavno računalo koje se koristi je višeprocesorsko. U ovom slučaju možemo gotovo udvostručiti performanse dodjeljivanjem dva odvojena, dugotrajna izračunavanja različitim procesorima.

U svijetu PHP računalstva takvi su primjeri rijetki. Međutim, budući da nigdje drugdje nisam našao točan opis, ovdje želim navesti primjer takvog ubrzanja.

niz ("cijev", "r"), 1 => niz ("cijev", "w"), 2 => niz ("datoteka", $ error_log, "w")); $ cmd = "spavanje". $ kašnjenje. "; echo" Završeno s kašnjenjem od ". $ kašnjenja." "."; $ ručke [$ id] = proc_open ($ cmd, $ deskriptorspec, $ cijevi); $ streams [$ id] = $ cijevi; $ all_pipes [$ id] = $ cijevi; $ kašnjenje - = 2; ) while (broj ($ tokova)) ($ read = $ streams; stream_select ($ read, $ w = null, $ e = null, $ timeout); foreach ($ čita se kao $ r) ($ id = array_search ($ r, $ streams); echo stream_get_contents ($ all_pipes [$ id]); if (feof ($ r)) (fclose ($ all_pipes [$ id]); fclose ($ all_pipes [$ id]); $ return_value = proc_close ($ obrađuje [$ id]); poništi ($ streamovi [$ id]);)))?>

Ovaj program će prikazati sljedeće informacije:

Program počinje u 10:28:41. Završeno s kašnjenjem od 1. Završeno s kašnjenjem od 3.

Ideja je da je PHP pokrenuo dva nezavisna podprocesa, primao podatke iz prvog, a zatim iz drugog, iako je potonji počeo ranije. Ako je glavno računalo višeprocesorsko i operativni sustav ispravno konfiguriran, ono se brine o dodjeli različitih podprograma različitim procesorima. Ovo je jedan od načina da iskoristite prednosti PHP-ovih višeprocesnih strojeva.

Sažetak

PHP podržava multitasking. PHP ne podržava stream obradu na način na koji drugi programski jezici kao što su Java ili C++, ali gornji primjeri su pokazali da PHP ima veći potencijal za ubrzanje nego što većina ljudi shvaća.


Dakle, prijatelji, ako ste došli do ove lekcije, onda ste uspjeli ili instalirati lokalni poslužitelj, ili kupiti hosting na kojem možete raditi s PHP-om. Čestitamo - ovo je veliki korak!

Ukratko ću reći o PHP-u – ovaj se programski jezik koristi u cijelom svijetu i na njemu možete kreirati stranice svih razina složenosti, od stranica s posjetnicama do velikih portala. Mislim da za mnoge više nije tajna da su najveće društvene mreže facebook.com(od nule do php) i vk.com(php engine) su napisani u PHP-u. Stoga donosimo zaključke i počinjemo raditi!)

Kako kod radi

PHP kod obrađen na strani poslužitelja... Odnosno, nema spremne stranice. Na primjer, u kodu se daje naredba za prikupljanje podataka o tome koliko je korisnika trenutno registrirano na stranici. Posjetitelj stranice klikne na vezu Svi korisnici... On želi dobiti dinamički podaci, odnosno one koje se stalno mijenjaju. Nakon što je odbrojavanje na poslužitelju završeno, podaci će doći s poslužitelja u obliku generiranog HTML-koda stranice s brojem korisnika. Kao rezultat toga, nakon klika na zahtjev na poveznici, korisnik dobiva stranicu. Ako pogledate kod rezultirajuće stranice, možete vidjeti samo HTML, a PHP kôd neće biti dostupan za gledanje. Grubo govoreći, PHP je instrukcija poslužitelju kako i iz kojih blokova napraviti stranicu.

Kako izgleda PHP kod i gdje ga umetnuti?

PHP kod se može ugraditi izravno u HTML. PHP kod je ugrađen u HTML stranice pomoću kutnih zagrada i upitnika , međutim, možete se ograničiti na zagrade s upitnicima ... Trebat ćete samo promijeniti ekstenziju datoteke, na primjer, from .html na .php

PHP kod(datoteka index.php)



Primjer upotrebe PHP-a


eho "Zdravo svijete!";
?>



Demonstracija Preuzmite izvore
Rezultat koda bit će izlaz običnog teksta Pozdrav svijete!... Pitajte zašto napisati php kod za prikaz običnog teksta? Eho izjava, o kojem ćemo govoriti malo kasnije, potreban je ne samo za prikaz teksta. Češće se eho koristi za prikaz rezultata rada neke funkcije koja je izračunala ili preuzela podatke iz baze podataka (Što je baza podataka?). Odnosno za dinamički prikaz podataka.

Izjava echo u PHP-u

Kao što ste već shvatili, operater jeka potrebno za izlaz podataka. Uzimamo sadržaj (u našem slučaju samo tekst do sada). citati, a na kraju stavljamo točku i zarez ; ovo označava kraj rada operatera.

U programiranju, prilikom izrade prve stranice, uobičajeno je koristiti izraz Pozdrav svijete!- to je Pozdrav svijete! Ovo je ono što koristimo. U primjeru nećemo koristiti html jer to nije potrebno.

PHP kod

odjek "Zdravo svijet!";
?>
Program će ispisati Pozdrav svijete!.
U prvom primjeru umetnuli smo mali php kod u html. Sada, naprotiv, ubacimo html elemente u php kod.

PHP kod

jeka " ";
jeka " ";
jeka " Moja prva PHP skripta";
jeka "";
jeka " ";
jeka "

Pozdrav svijete!

";
jeka "";
?>
Kao rezultat, dobivamo praznu stranicu s naslovom Pozdrav svijete!

PHP izjava za ispis

Za razliku od echo izjave, ispis ispisuje podatke uključujući razmake i crtice. Ima neka ograničenja - možete koristiti samo jedan argument, ponoviti nekoliko. Traje dulje od jeke. U nastavku ćemo koristiti ovaj operator prilikom pisanja funkcija.

print "Zdravo svijete!
Drugi redak teksta "; // rezultat će biti prikazan u dva retka
?>
Tekst će biti prikazan onako kako je napisan.

Izlazni izraz - PHP heredoc sintaksa

Kao što ste već primijetili, prikazivanje stranice stalnim korištenjem echo operatora je ružno i nečitljivo. Stoga, za izlaz velikih dijelova html koda, postoji još jedan izlazni izraz koji koristi heredoc sintaksu. Također prikazuje podatke u istom obliku u kojem su bili (razmaci i crtice).

jeka<<

Primjer


Primjer izlaza velike količine teksta pomoću html-a


Drugi odlomak istog obimnog teksta.


OVDJE;
?>

Podsjetnik lekcije

PHP kod može:

1. ne sadrže nikakav html element. Stranica i tekst će i dalje biti prikazani. html je potreban za lijepo označavanje sadržaja.

2. biti uključeni u html-kod i sadržavati ga unutar vlastitih izlaznih izjava (echo, print, itd.). Glavna stvar je ne zaboraviti dizajn

3. stranice s php-kodom moraju imati odgovarajuće proširenje: .php .phtml

Od sljedećih lekcija ćemo pokriti osnove izrade stranica u php-u, u kojima ćete vidjeti sve prednosti korištenja ovog jezika!

Hvala na pažnji!

Ugodan dan svima. Ovo je prvi članak u PHP seriji za početnike. Ovo će biti neobična serija članaka, neće biti odjeka "Hello World", bit će hardcore iz života PHP programera s malo "domaće zadaće" za konsolidaciju gradiva.

Počet ću sa seansama – ovo je jedna od najvažnijih komponenti s kojom ćete morati raditi. Ne razumijevanje principa njegovog rada - twist business. Dakle, kako bih izbjegao probleme, pokušat ću vam reći o svim mogućim nijansama.

Ali prvo, da bismo razumjeli zašto nam je potrebna sesija, okrenimo se podrijetlu - HTTP protokolu.

HTTP protokol

HTTP protokol je HyperText Transfer Protocol – tj. zapravo je riječ o tekstualnom protokolu i neće ga biti teško razumjeti.

U početku se pretpostavljalo da će se ovim protokolom prenositi samo HTML, s mjesta i imena, ali sada ono što ne šalju (_ ㅅ _) = ^. ^ =

Da ne bismo zalutali, dopustite mi da vam dam primjer komunikacije preko HTTP protokola, evo zahtjeva kako ga vaš preglednik šalje kada zatražite stranicu http://example.com:

GET / HTTP / 1.1 Host: example.com Prihvati: tekst / html ... prazan niz ...

A evo primjera odgovora:

HTTP / 1.1 200 OK Duljina sadržaja: 1983 Vrsta sadržaja: tekst / html; skup znakova = utf-8 ... ...

Ovo su vrlo pojednostavljeni primjeri, ali ovdje možete vidjeti od čega se sastoji HTTP zahtjev i odgovor:

  1. startna linija- za zahtjev sadrži metodu i put tražene stranice, za odgovor - verziju protokola i kod odgovora
  2. naslovi- imaju ključ/vrijednost formata odvojene dvotočkom, svako novo zaglavlje piše se u novom retku
  3. tijelo poruke- HTML izravno ili su podaci odvojeni od zaglavlja s dva prijeloma reda, može biti odsutan, kao u danom zahtjevu

Dakle, čini se, skužili su protokol - jednostavan je, vodi svoju povijest od 1992. godine, pa ga ne možete nazvati idealnim, ali ono što je - poslao zahtjev - dobijete odgovor, i to je to, server a klijent više ni na koji način nisu povezani. Ali takav scenarij nikako nije jedini mogući, možemo imati autorizaciju, poslužitelj mora nekako shvatiti da je taj zahtjev došao od konkretnog korisnika, t.j. klijent i poslužitelj moraju komunicirati unutar određene sesije. I da, smislili su sljedeći mehanizam za to:

  1. prilikom autorizacije korisnika, poslužitelj generira i pamti jedinstveni ključ - identifikator sesije i obavještava preglednik
  2. preglednik pohranjuje ovaj ključ i sa svakim sljedećim zahtjevom ga šalje

Za implementaciju ovog mehanizma stvoreni su (kolačići, kolačići) - jednostavne tekstualne datoteke na vašem računalu, jedna datoteka za svaku domenu (iako su neki preglednici napredniji i za pohranu koriste SQLite bazu podataka), dok preglednik nameće ograničenje broja zapisa i veličine pohranjenih podataka (za većinu preglednika to je 4096 bajtova, vidi RFC 2109 iz 1997.)

Oni. ako ukradete kolačić iz vašeg preglednika, hoće li biti moguće otići na vašu facebook stranicu u vaše ime? Ne brinite, to se ne može, barem s facebookom, a onda ću vas naučiti kako se možete zaštititi od ovakve vrste napada na svoje korisnike.

Pogledajmo sada kako će se naš zahtjev-odgovor promijeniti, postoji li autorizacija:

POST / prijava / HTTP / 1.1 Host: example.com Prihvati: tekst / html prijava = Korisničko ime i lozinka = Userpass

Naša metoda je promijenjena u POST, a u tijelu zahtjeva se prenose korisničko ime i lozinka (ako koristite metodu GET, niz zahtjeva će sadržavati korisničko ime i lozinku, a može biti spremljen na nekim posrednim proxy poslužiteljima, koji je jako loše).

HTTP / 1.1 200 OK Vrsta sadržaja: tekst / html; skup znakova = utf-8 Set-Cookie: KEY = VerySecretUniqueKey ... ...

Odgovor poslužitelja sadržavat će zaglavlje Set-Cookie: KEY = VerySecretUniqueKey, koje će prisiliti preglednik da te podatke spremi u kolačiće, a sljedeći put kada se pristupi poslužitelju, oni će biti poslani i prepoznati od strane poslužitelja:

GET / HTTP / 1.1 Host: example.com Prihvati: tekst / html kolačić: KEY = VerySecretUniqueKey ... prazan niz ...

Kao što možete vidjeti, zaglavlja poslana od strane preglednika (zaglavlja zahtjeva) i poslužitelja (zaglavlja odgovora) su različita, iako postoje zajednička zaglavlja i za zahtjeve i za odgovore (opća zaglavlja).

Poslužitelj je prepoznao našeg korisnika po poslanim kolačićima, te će mu nadalje omogućiti pristup osobnim podacima. Dakle, dobro, nekako riješeno sa sesijama i HTTP-om, sada se možete vratiti na PHP i njegove značajke.

PHP i sesija

Nadam se da već imate instaliran PHP na vašem računalu, budući da dalje ću dati primjere i trebat će ih pokrenuti

PHP je stvoren da odgovara HTTP protokolu – t.j. njegov glavni zadatak je odgovoriti na HTTP zahtjev i "umrijeti" oslobađajući memoriju i resurse. Stoga mehanizam sesije u PHP-u ne radi u automatskom načinu rada, već u ručnom načinu rada, i morate znati što pozvati i kojim redoslijedom.

Prije svega, trebate "pokrenuti" sesiju - za to ćemo koristiti funkciju session_start (), stvoriti datoteku session.start.php sa sljedećim sadržajem:

Početak_sesije ();

A sada - ažuriramo stranicu i vidimo da preglednik šalje ovaj kolačić na poslužitelj, možete pokušati osvježiti stranicu nekoliko puta, rezultat će biti identičan:

Ukupno imamo - teorija se poklopila s praksom, i to je sasvim u redu.

Sljedeći korak je spremanje proizvoljne vrijednosti u sesiju, za to PHP koristi superglobalnu varijablu $ _SESSION, a mi ćemo spremiti trenutno vrijeme pozivom funkcije date ():

Početak_sesije (); $ _SESSION ["vrijeme"] = datum ("H: i: s"); echo $ _SESSION ["vrijeme"];

Ažuriramo stranicu i vidimo vrijeme poslužitelja, ponovno ga ažuriramo - i vrijeme je ažurirano. Učinimo sada tako da se postavljeno vrijeme ne mijenja svaki put kada se stranica osvježi:

Početak_sesije (); if (! isset ($ _ SESSION ["vrijeme"])) ($ _SESSION ["vrijeme"] = datum ("H: i: s");) echo $ _SESSION ["vrijeme"];

Ažuriramo - vrijeme se ne mijenja, ono što je potrebno. Ali u isto vrijeme, sjećamo se da PHP umire, što znači da pohranjuje ovu sesiju negdje, a mi ćemo pronaći ovo mjesto ...

Sva tajna postaje jasna

Prema zadanim postavkama, PHP pohranjuje sesiju u datoteke - za to je odgovorna direktiva session.save_handler, potražite stazu na kojoj su datoteke spremljene u direktivi session.save_path ili upotrijebite funkciju session_save_path () da biste dobili traženu stazu.

U vašoj konfiguraciji put do datoteka možda nije naveden, tada će datoteke sesije biti pohranjene u privremene datoteke na vašem sustavu - pozovite funkciju sys_get_temp_dir () i saznajte gdje je to skriveno mjesto.

Dakle, idemo ovim putem i pronalazimo vašu datoteku sesije (imam ovu datoteku sess_dap83arr6r3b56e0q7t5i0qf91), otvorite je u uređivaču teksta:

Vrijeme | s: 8: "16:19:51";

Kao što vidite, ovo je naše vrijeme, ovo je lukav format u kojem je pohranjena naša sesija, ali možemo uređivati, mijenjati vrijeme ili jednostavno možemo unijeti bilo koji redak, zašto ne:

Vrijeme | s: 13: "\ m / (@ [e-mail zaštićen]) \ m / ";

Da biste ovaj niz pretvorili u niz, trebate koristiti funkciju session_decode (), za obrnutu konverziju - session_encode () - to se zove serijalizacija, ali samo u PHP-u za sesije - posebna je, iako možete koristiti standardnu ​​PHP serijalizaciju - upišite ga u konfiguracijskoj direktivi session .serialize_handler php_serialize vrijednost i bit ćete sretni, a $_SESSION se može koristiti bez ograničenja - sada možete koristiti brojeve i posebne znakove kao indeks | i! u ime (za svih 10+ godina rada nikad nisam morao :)

Vježbajte
Napišite vlastitu funkciju, sličnu funkcionalnosti session_decode (), ovdje je testni skup podataka za sesiju (ne trebate poznavanje regularnih izraza za rješavanje), uzmite tekst za konverziju iz datoteke vaše trenutne sesije:

$ _SESSION ["integer var"] = 123; $ _SESSION ["float var"] = 1,23; $ _SESSION ["octal var"] = 0x123; $ _SESSION ["string var"] = "Zdravo svijete"; $ _SESSION ["array var"] = ["jedan", "dva",]; $ objekt = novi stdClass (); $ object-> foo = "bar"; $ object-> arr = ["zdravo", "svijet"]; $ _SESSION ["object var"] = $ objekt; $ _SESSION ["ponovo cijeli broj"] = 42;

Dakle, što još nismo probali? Tako je – da ukrademo kolačiće, pokrenimo drugi preglednik i dodajmo mu iste kolačiće. Napisao sam vam jednostavan javascript za ovo, kopirajte ga u konzolu preglednika i pokrenite ga, samo ne zaboravite promijeniti identifikator sesije u svoj:

Javascript: (funkcija () (document.cookie = "PHPSESSID = dap83arr6r3b56e0q7t5i0qf91; put = /;"; window.location.reload ();)) ()

Sada imate oba preglednika koji gledaju istu sesiju. Gore sam spomenuo da ću govoriti o metodama zaštite, razmotriti najjednostavniji način - vezat ćemo sesiju na preglednik, točnije, na to kako se preglednik pojavljuje na poslužitelju - zapamtit ćemo User-Agent i provjeriti ga svaki put:

Početak_sesije (); if (! isset ($ _ SESSION ["vrijeme"])) ($ _SESSION ["ua"] = $ _SERVER ["HTTP_USER_AGENT"]; $ _SESSION ["vrijeme"] = datum ("H: i: s") ; ) if ($ _SESSION ["ua"]! = $ _SERVER ["HTTP_USER_AGENT"]) (die ("Pogrešan preglednik");) echo $ _SESSION ["vrijeme"];

Ovo je teže lažirati, ali je još uvijek moguće, dodajte ovdje spremanje i provjeru $ _SERVER ["REMOTE_ADDR"] i $ _SERVER ["HTTP_X_FORWARDED_FOR"], i to će manje-više izgledati kao zaštita od uljeza koji zadiru u naše "kolačiće".

Ključna riječ u prethodnom odlomku čini se, u stvarnim projektima kolačići već dugo rade preko HTTPS protokola, tako da ih nitko ne može ukrasti bez fizičkog pristupa vašem računalu ili pametnom telefonu

Vježbajte
Dodajte provjeru IP-a korisnika u kod, ako provjera ne uspije, izbrišite ugroženu sesiju.

Korak po korak

A sada ću objasniti korak po korak algoritam kako sesija funkcionira u PHP-u, koristeći primjer sljedećeg koda (zadane postavke):

Početak_sesije (); $_SESSION ["id"] = 42;

  1. nakon poziva session_start () PHP traži identifikator sesije u kolačiću po imenu navedenom u session.name - ovo je PHPSESSID
  2. ako ne postoji identifikator, tada se kreira (vidi session_id ()) i stvara praznu datoteku sesije duž puta session.save_path s imenom sess_ (session_id ()), zaglavlja će biti dodana u odgovor poslužitelja za postavljanje kolačić (naziv_sesije ()) = (id_sesije ())
  3. ako je identifikator prisutan, tada tražimo datoteku sesije u mapi session.save_path:
    • nije pronađeno - kreirajte praznu datoteku pod nazivom sess _ ($ _ COOKIE) (identifikator može sadržavati samo znakove iz raspona a-z, A-Z, 0-9, zarez i znak minus)
    • pronađite, pročitajte datoteku i raspakirajte podatke (pogledajte session_decode ()) u superglobalnu varijablu $ _SESSION
  4. kada skripta završi svoj rad, tada se svi podaci iz $ _SESSION pakiraju pomoću session_encode () u datoteku duž putanje session.save_path pod nazivom sess_ (session_id ())

Vježbajte
Postavite u svom pregledniku proizvoljnu vrijednost za kolačić pod nazivom PHPSESSID, neka bude 1234567890, osvježite stranicu, provjerite jeste li stvorili novu datoteku sess_1234567890

Ima li života bez kolačića?

PHP može raditi sa sesijom čak i ako su kolačići onemogućeni u pregledniku, ali tada će svi URL-ovi na stranici sadržavati parametar s identifikatorom vaše sesije, i da - to još uvijek treba konfigurirati, ali trebate li ga? Nisam ga morao koristiti, ali ako baš želim, samo ću ti reći gdje da kopaš:

A ako trebate pohraniti sesiju u bazu podataka?

Da biste pohranili sesiju u bazu podataka, morate promijeniti pohranu sesije i reći PHP-u kako da je koristi; u tu svrhu stvoreno je sučelje SessionHandlerInterface i funkcija session_set_save_handler.

Zasebno, napominjem da ne morate pisati vlastite rukovatelje sesije za redis i memcache - kada instalirate ova proširenja, odgovarajući rukovatelji idu uz njih, tako da je RTFM naše sve. Pa, da, rukovatelj mora biti naveden prije poziva session_start (;)

Vježbajte
Implementirajte SessionHandlerInterface za pohranu MySQL sesije, provjerite radi li.
Ovo je zadatak sa zvjezdicom za one koji su već upoznati s bazama podataka.

Kada sesija umire?

Zanimljivo pitanje, možete ga postaviti iskusnim programerima - kada PHP briše datoteke sesije koje je isteklo? Odgovor je u službenom priručniku, ali ne eksplicitno - pa zapamtite:

Sakupljanje smeća može se pokrenuti kada se pozove funkcija session_start (), vjerojatnost pokretanja ovisi o dvije direktive session.gc_probability i session.gc_divisor, prva djeluje kao dividenda, druga kao djelitelj, a prema zadanim postavkama ove vrijednosti ​su 1 i 100, tj. vjerojatnost da će se sakupljač pokrenuti i datoteke sesije izbrisati je približno 1%.

Vježbajte
Promijenite vrijednost session.gc_divisor direktive tako da se sakupljač smeća pokreće svaki put, provjerite da li se to događa.

Najtrivijalnija greška

Pogreška s više od pola milijuna rezultata u Google rezultatima pretraživanja:

Ne mogu poslati kolačić sesije - zaglavlja su već poslana po
Nije moguće poslati ograničavač predmemorije sesije - zaglavlja su već poslana

Da biste je dobili, stvorite datoteku session.error.php sa sljedećim sadržajem:

Echo str_pad ("", ini_get ("output_buffering")); početak_sesije ();

U drugom retku je čudna "čarolija" - ovo je trik s izlaznim međuspremnikom, o tome ću govoriti u jednom od sljedećih članaka, za sada ga razmotrite samo kao redak od 4096 znakova, u ovom slučaju, sve su to prostori

Pokrenite, nakon brisanja kolačića, i dobit ćete gore navedene pogreške, iako je tekst pogreške drugačiji, ali suština je ista - vlak je otišao - poslužitelj je već poslao sadržaj stranice pregledniku, a također je i kasno sa slanjem zaglavlja, to neće funkcionirati, a željeni identifikator sesije nije se pojavio u kolačićima. Ako ste naišli na ovu pogrešku, potražite mjesto na kojem se prikazuje tekst
ispred vremena, to može biti razmak ispred znakovau jednoj od priloženih datoteka, i u redu, ako je razmak, možda postoji neki znak koji se ne može ispisati kao BOM, stoga budite oprezni i ova vas infekcija neće dotaknuti (pa,... homerski smijeh).

Vježbajte
Da biste testirali ovo znanje, želim da implementirate vlastiti mehanizam sesije i učinite da gornji kod radi:

Require_once "include / sess.php"; sess_start (); if (isset ($ _ SESS ["id"])) (echo $ _SESS ["id"];) else ($ _SESS ["id"] = 42;)

Da biste to postigli, potrebna vam je funkcija register_shutdown_function ().

Konačno

U ovom članku vam je zadano šest zadataka, a oni se ne odnose samo na rad sa sesijama, već vas upoznaju i s MySQL-om i funkcijama rada sa stringovima. Za savladavanje ovog materijala - ne treba vam poseban članak, bit će dovoljan priručnik na danim poveznicama - nitko ga neće pročitati umjesto vas. Samo naprijed!

p.s. Ako ste naučili nešto novo iz članka - hvala autoru - podijelite članak na društvenim mrežama;)

Ako ste novi u PHP-u, postoje neke definicije koje trebate znati.
Prije svega, PHP je programski jezik i koristi se za pisanje naredbi (skripti) upućenih poslužitelju. Još jednostavnije rečeno, pomoću PHP-a možemo komunicirati s poslužiteljem.
PHP naredbe se lako ugrađuju u HTML stranice. Upravo je ovo svojstvo važna prednost PHP-a u odnosu na jezike kao što su Perl i C.

PHP sintaksa

PHP kod skripte počinje nakon otvaranja oznake... Tekst između ove dvije oznake čita program na poslužitelju, a rezultat se ispisuje u HTML dokument. Uzmimo primjer:



Primjer

uključiti ("sidebar.htm");
?>


Ako trebamo nešto umetnuti u html kod stranice, moramo koristiti naredbu include. Zatim označavamo adresu datoteke, a redak završava, kao u CSS-u;

Umetnite HTML kod u stranice web-mjesta

U pravilu, bočne trake ( bočna traka) i podrum ( podnožje) ostaju nepromijenjeni na svim stranicama stranice. Stoga kodovi

.....
i može se postaviti u zasebne htm stranice "sidebar.htm" i "footer.htm" i umetnuti u stranice web-mjesta pomoću naredbe include. Ako se istovremeno glavni sadržaj prenese u zasebnu datoteku -
.....
, tada će kod naše stranice izgledati ovako:



Primjer

uključiti ("sidebar.htm");
uključiti ("content.htm");
uključiti ("footer.htm");
?>


bočna traka.htm sadržaj


ovdje
sadržaj
Tvoja njegova
bočna traka

Isto tako s datotekama content.htm i footer.htm.

S ovom generacijom stranica, samo trebate napraviti promjene u jednoj datoteci "sidebar.htm" kako biste promijenili sve stranice stranice. Ovo je vrlo zgodno ako se vaša stranica sastoji od stotina ili tisuća stranica.

PHP na vašem računalu

Da biste mogli raditi s PHP skriptama i vidjeti rezultate izvršenja u pregledniku, morate instalirati radni web poslužitelj s PHP-om na svoje lokalno računalo.
Denver je najprikladniji za takve zadatke. (službena stranica nudi sve što vam treba je besplatan) Instalacijski komplet uključuje - Apache, php i MySQL. Drugim riječima, potpuno funkcionalan poslužitelj za hosting stranica bit će smješten na vašem računalu.

Da bi PHP kod radio na HTML stranicama, morate otvoriti datoteku .htaccess u bilo kojem uređivaču teksta i napišite sljedeće:

Aplikacija AddHandler / x-httpd-php .html

Ovaj unos omogućuje izvršavanje PHP skripti na HTML stranicama.

Ili promijenite ekstenziju datoteke. html na. php

PHP značajke

PHP je sposoban za više od pukog prikazivanja HTML-a. PHP-ove mogućnosti uključuju generiranje slika, PDF-ova, pa čak i Flash filmova (pomoću libswf-a i Ming-a) generiranih u hodu. PHP je također sposoban posluživati ​​sve tekstualne podatke kao što su XHTML i druge XML datoteke. PHP može automatski generirati takve datoteke i pohraniti ih u datotečni sustav vašeg poslužitelja umjesto da ih poslužuje klijentu, organizirajući tako predmemoriju dinamičkog sadržaja na strani poslužitelja.

Jedna od značajnih prednosti PHP-a je njegova podrška za širok raspon baza podataka. Ukratko, PHP vam ima puno toga za ponuditi! Više detalja o prednostima PHP-a možete pronaći na www.php.su.

1. veljače 2015


Kada počnu pisati programe za web, mnogi programeri početnici susreću se s ovom pogreškom. Oni gledaju na sustav preglednika i poslužitelja kao na normalnu aplikaciju. Interaktivan. Pritisnuo sam tipku - sustav je reagirao. Nacrtao sam ga mišem – reagiralo je. Programu su dostupne i sve informacije koje su dostupne klijentu, program je cijelo vrijeme u memoriji.
Dakle, u web programiranju ovo nije istina!.
U trenutku kada korisnik vidi stranicu ispred sebe i počne s njom izvoditi neke radnje, PHP je već izašao! A korisnik ne komunicira s PHP skriptom, već sa svojom HTML stranicom koju je primio u pregledniku. U većini slučajeva, rezultat PHP skripte je običan tekst. Tekst HTML stranice. Koji se daje pregledniku i prikazuje kao normalan HTML. Možete se i sami uvjeriti upisom u scenarij
"Hej, Vasya!" ; ?> ;
A zatim pregledom izvornog teksta rezultirajuće stranice u pregledniku. Tamo nema PHP oznaka! Samo
Hej, Vasya!
Jer PHP se izvršava na poslužitelju!

Poslužitelj i preglednik komuniciraju tako što međusobno šalju zahtjeve pomoću posebnog protokola - HTTP. Samo preglednik može pokrenuti vezu. Šalje zahtjev poslužitelju da pokaže tu i takvu datoteku. Poslužitelj šalje datoteku klijentu.
To je jedini način na koji se to događa. Klijent je zatražio - poslužitelj ga je dao. I odmah zaboravio na klijenta. Odavde postaje jasan odgovor na pitanje da li je moguće točno znati koliko je korisnika sada na stranici. Zabranjeno je. jer nema niti jednog "na sajtu". Povezuju se, traže stranicu i prekidaju vezu. Nemojte imati stalnu vezu s poslužiteljem, kao, na primjer, Kwaku igrači. To možete saznati samo približno tako da zabilježite vrijeme svake veze i odaberete zapise za određeno vremensko razdoblje.

Primjer komunikacije između preglednika i poslužitelja:
Korisnik klikne na link, preglednik šalje zahtjev poslužitelju i čeka odgovor:
Preglednik -> PHP
PHP izvršava skriptu, šalje rezultat pregledniku i izlazi:
PHP -> preglednik
Preglednik prikazuje stranicu, "skenirajući" je tražeći veze koje je potrebno zatražiti od poslužitelja (oznake ,