Računalniki Windows internet

Ustvarjanje html strani s PHP. Kakšna je razlika med datoteko php in datoteko html Kaj morate vedeti

Cameron Laird

PHP ne podpira obdelave toka. Kljub temu in v nasprotju s tem, kar meni večina razvijalcev PHP, so lahko PHP aplikacije večopravilne. Začnimo z razjasnitvijo, kaj "večopravilnost" in "threading" pomenita za programiranje PHP.

Večplastna vzporednost

Najprej pustimo ob strani primere, ki ležijo izven kanala glavne teme. PHP ima zapleteno razmerje z večopravilnostjo ali sočasnostjo. Na najvišji nivo PHP je nenehno vključen v večopravilnost – standardne PHP namestitve na strežniku (npr. modul Apache) se uporabljajo na večopravilni način. To pomeni, da lahko več odjemalskih aplikacij (spletnih brskalnikov) hkrati zahteva isto stran PHP, spletni strežnik pa jo bo vrnil vsem bolj ali manj hkrati.

Ena spletna stran ne blokira prenosa druge, čeprav se lahko med seboj nekoliko motijo, ko se ukvarjajo z omejenimi viri, kot je pomnilnik strežnika ali pasovna širina omrežja. V to smer, sistemska zahteva sočasnost lahko omogoča rešitve, ki temeljijo na PHP. V smislu izvedbe PHP postavlja spletni strežnik odgovoren za sočasnost.

Sočasnost na strani odjemalca, imenovana Ajax, je v zadnjih nekaj letih pritegnila tudi pozornost razvijalcev. Čeprav je pomen Ajaxa postal nekoliko nejasen, je eden od vidikov te tehnologije ta, da lahko brskalnik hkrati izvaja izračune in ostane občutljiv na dejanja uporabnikov, kot so izbire v meniju. Res je nekako večopravilnost. PHP kodiran Ajax to počne, vendar brez posebne vpletenosti PHP; Okvirji Ajax za druge jezike delujejo na enak način.

Tretji primer hkratnosti, ki samo opraska površino PHP, je PHP/TK. PHP/TK je razširitev PHP, ki zagotavlja prenosne povezave grafičnega uporabniškega vmesnika (GUI) na jedro PHP. PHP/TK vam omogoča ustvarjanje namiznih GUI aplikacij, napisanih v PHP. Njegovi vidiki, ki temeljijo na dogodkih, modelirajo obliko vzporednosti, ki se je enostavno naučiti in je manj nagnjena k napakam kot niti. Ponovno je vzporednost "podedovana" iz dodatne tehnologije, ne pa temeljna značilnost PHP.

Bilo je več poskusov za dodajanje podpore za niti v sam PHP. Kolikor vem, nobena ni bila uspešna. Vendar pa ogrodja Ajax in PHP/TK, ki temeljijo na dogodkih, kažejo, da lahko dogodki bolje izražajo sočasnost za PHP kot niti. PHP V5 to dokazuje.

PHP V5 ponuja stream_select()

V standardnem PHP V4 in starejših je treba vse delo aplikacije PHP opraviti zaporedno. Če mora program na primer izvleči ceno izdelka iz dveh komercialnih mest, zahteva prvo ceno, čaka na odgovor, zahteva drugo ceno in znova čaka.

Kaj pa, če bi program lahko opravljal več nalog hkrati? Končal bi se v le delčku časa, potrebnega za zaporedno delo.

Prvi primer

Nova funkcija stream_select skupaj z nekaj svojimi prijatelji zagotavlja to možnost. Razmislite o naslednjem primeru:

0) ( $s=stream_socket_client("phaseit.net:80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT/STREAM_CLIENT_CONNECT); if ($s) ( $sockets[$id++]=$s; $http_message=" GET /demonstration/delay?delay=" . $delay . " HTTP/1.0\r\nHost: phaseit.net\r\n\r\n"; fwrite($s, $http_message); ) else ( echo "Pretok " . $id . " ni uspelo pravilno odpreti."; ) $delay -= 3; ) while (count($sockets)) ( $read=$sockets; stream_select($read, $w=null, $e=null , $timeout); if (count($read)) ( /* stream_select običajno premeša $read, zato moramo ugotoviti, iz katerega vtičnice naj beremo. */ foreach ($read as $r) ( $id=array_search( $ r, $sockets); $data=fread($r, $convenient_read_block); /* Vtičnico je mogoče brati, ker ima podatke za branje ALI ker je v stanju EOF. */ if (strlen($data ) = = 0) ( echo "Tok " . $id . " se zapre ob " . date("h:i:s") . ".\n"; fclose($r); unset($sockets[$id] ); ) else ( $result[$id] .= $data; ) ) ) else ( /* tajščina maut pomeni, da *vse* niti niso čakale na odgovor. */ echo "Časovna omejitev!\n"; zlom; )) ?>

Če zaženete ta program, bodo prikazane naslednje informacije:

Program se prične ob 02:38:50. Tok 4 se zapre ob 02:38:53. Tok 3 se zapre ob 02:38:56. Tok 2 se zapre ob 02:38:59. Tok 1 se zapre ob 02:39:02. Tok 0 se zapre ob 02:39:05.

Pomembno je razumeti, kaj se tukaj dogaja. Na visoka stopnja prvi program naredi več zahtev HTTP in pridobi strani, ki mu jih posreduje spletni strežnik. Čeprav bi prava aplikacija verjetno zahtevala več različnih spletnih strežnikov (morda google.com, yahoo.com, ask.com itd.), ta primer vse zahteve posreduje našemu korporativni strežnik na Phaseit.net samo za zmanjšanje zapletenosti.

Zahtevane spletne strani vrnejo rezultate po spremenljivi zamudi, prikazani spodaj. Če bi program izvajal zahteve zaporedno, bi trajalo približno 15+12+9+6+3 (45) sekund. Kot je prikazano na seznamu 2, se dejansko zaključi v 15 sekundah. Potrojitev produktivnosti je odličen rezultat.

To je bilo mogoče zahvaljujoč stream_select - nova funkcija v PHP V5. Zahteve so sprožene na običajen način- tako, da odprete več stream_socket_clients in vsakemu od njih napišete GET, ki ustreza http://phaseit.net/demonstration/delay?delay=$DELAY . Ko zahtevate ta URL v brskalniku, bi morali videti:


Čeprav je posebna izvedba v seznamu 3 namenjena UNIX®, skoraj vsi scenariji v tem članku delujejo enako dobro za namestitve PHP v sistemu Windows® (zlasti po Windows 98) ali UNIX. Zlasti seznam 1 deluje v katerem koli operacijskem sistemu. Linux® in Mac OS X sta različici UNIX-a in vsa koda tukaj bo delovala v obeh sistemih.

Zahteve do strežnika zakasnitve se izvedejo v naslednjem vrstnem redu:

zamuda=15 zakasnitev=12 zakasnitev= 9 zakasnitev= 6 zakasnitev= 3

Namen stream_select je čim hitreje dobiti rezultate. V tem primeru je vrstni red zamud nasproten vrstnemu redu, v katerem so bile vložene zahteve. Po 3 sekundah je prva stran pripravljena za branje. Ta del programa je običajna PHP koda - v tem primeru s fread . Tako kot v drugem programu PHP je mogoče branje opraviti s fgets.

Obdelava se nadaljuje na enak način. Program blokira v stream_select, dokler niso podatki pripravljeni. Ključno je, da se začne brati takoj, ko ima katera koli povezava podatke, v poljubnem vrstnem redu. Tako program izvaja večopravilnost ali vzporedno obdelavo rezultatov več poizvedb.

Upoštevajte, da na gostiteljskem računalniku ni dodatne obremenitve CPE. Ni nenavadno, da omrežni programi, ki se ukvarjajo s tem načinom, kmalu začnejo uporabljati 100 % moči CPE. Tukaj ni tako, saj ima stream_select želene lastnosti in se odzove takoj, ko je možno branje, medtem ko še vedno minimalno zaseda CPE v stanju mirovanja med branji.

Kaj morate vedeti o stream_select()

Takšno programiranje na podlagi dogodkov ni osnovna naloga. Čeprav je bil seznam 1 zmanjšan na najosnovnejše točke, bo vsako kodiranje, ki temelji na povratnih klicih ali koordinaciji (ki je potrebno v večopravilnih aplikacijah), manj poznano kot preprosto proceduralno zaporedje. V tem primeru je največja težava v nizu $read. Upoštevajte, da je to povezava; stream_select vrne pomembne informacije s spreminjanjem vsebine $read. Tako kot imajo kazalci sloves, da so stalni vir napak v C, se zdi, da so reference tisti del PHP, ki programerjem predstavlja največjo težavo.

To tehniko poizvedbe je mogoče uporabiti s poljubnega števila zunanjih spletnih mest, s čimer zagotovite, da program dobi vsak rezultat čim hitreje, ne da bi čakal na druge poizvedbe. Pravzaprav ta tehnika deluje pravilno s katero koli povezavo TCP/IP, ne samo s spletom (vrata 80), tako da lahko načeloma nadzorujete pridobivanje podatkov LDAP, prenos SMTP, zahteve SOAP itd.

Ampak to še ni vse. PHP V5 upravlja različne povezave kot "tokove" in ne kot preproste vtičnice. Knjižnica URL-jev odjemalca PHP (CURL) podpira potrdila HTTPS, odhodni prenos FTP, piškotke in drugo (CURL aplikacijam PHP omogoča uporabo različnih protokolov za povezavo s strežniki). Ker CURL izpostavlja pretočni vmesnik, je povezava pregledna z vidika programa. Naslednji razdelek pojasnjuje, kako stream_select multipleksira celo lokalne izračune.

Obstaja nekaj opozoril za stream_select. Ta funkcija ni dokumentirana, zato ni zajeta niti v novih knjigah o PHP. Več primerov kod, ki so na voljo na spletu, preprosto ne delujejo ali pa niso jasni. Drugi in tretji argument za stream_select, ki nadzorujeta kanale za zapisovanje in izjeme, ki ustrezajo kanalom za branje na seznamu 1, bi morala biti skoraj vedno nič. Z nekaj izjemami je izbira teh kanalov napaka. Če nimate dovolj izkušenj, uporabite le dobro opisane možnosti.

Prav tako se zdi, da ima stream_select napake, glede na vsaj, v PHP V5.1.2. Najpomembneje je, da vrnjeni vrednosti funkcije ni mogoče zaupati. Čeprav implementacije še nisem odpravil napak, so moje izkušnje pokazale, da je varno preizkusiti count($read) kot v seznamu 1, vendar to kljub uradni dokumentaciji ne velja za vrnjeno vrednost samega stream_select.

Lokalna sočasnost PHP

Primer in glavnina zgornje razprave sta se osredotočila na to, kako hkrati upravljati več oddaljenih virov in doseči rezultate, ko pridejo, namesto da bi čakali, da se vsak obdela po vrstnem redu začetnih zahtev. To je nedvomno pomembna uporaba PHP-jevega paralelizma. Včasih je resnične aplikacije mogoče pospešiti za faktor deset ali več.

Kaj pa, če se upočasnitev zgodi bližje? Ali obstaja način za pospešitev pridobivanja rezultatov v PHP pri lokalni obdelavi? Obstaja več. Morda so celo manj znani kot pristop, usmerjen v vtičnice v seznamu 1. Za to obstaja več razlogov, vključno z:

  • Strani PHP so večinoma dovolj hitre. Boljša zmogljivost je lahko prednost, vendar ni dovolj, da bi upravičila naložbo v novo kodo.
  • Uporaba PHP na spletnih straneh lahko delno pospeševanje kode postane nepomembno. Prerazporeditev izračunov na način, da se hitreje dobijo vmesni rezultati, ni pomembna, če je edino merilo hitrost dostave spletne strani kot celote.
  • PHP nadzira nekaj lokalnih ozkih grl. Uporabniki se lahko pritožijo, da pridobivanje informacij o račun traja 8 sekund, vendar je to lahko omejitev obdelave baze podatkov ali nekaterih drugih virov zunaj PHP. Tudi če skrajšate čas obdelave PHP na nič, bo samo iskanje še vedno trajalo več kot 7 sekund.
  • Še manj omejitev je primerno za vzporedno obdelavo. Pretvarjajmo se določeno stran izračuna priporočeno ceno za navedene navadne delnice, izračuni pa so precej zapleteni in trajajo veliko sekund. Izračun je lahko zaporedni. Ni očitnega načina, da bi ga dodelili za "sodelovanje".
  • Malo programerjev PHP razume potencial PHP za vzporedno obdelavo. Ko smo govorili o možnosti paralelizacije, je večina programerjev, ki sem jih srečal, preprosto citirala frazo »PHP ne deluje z nitimi« in se vrnila k svojemu uveljavljenemu modelu računalništva.

Včasih je mogoče doseči več. Recimo, da mora stran PHP izračunati dve ceni delnic, ju morda primerjati, gostiteljski stroj pa je večprocesorski. V tem primeru lahko skoraj podvojimo zmogljivost z dodelitvijo dveh ločenih, zamudnih izračunov različnim procesorjem.

V svetu računalništva PHP so takšni primeri redki. Ker pa natančnega opisa nisem našel nikjer drugje, želim tukaj navesti primer takšnega pospeška.

array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("file", $error_log, "w")); $cmd="spanje" . $ zamuda. "; echo "Končano z zamudo " . $delay . ""."; $handles[$id]=proc_open($cmd, $descriptorspec, $pipes); $streams[$id]=$cevi; $all_pipes[$id]=$cevi; $zamik -= 2; ) while (count($streams)) ( $read=$streams; stream_select($read, $w=null, $e=null, $timeout); foreach ($read as $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 ($handles[$id]); unset($streams[$id]); ) ) ) ?>

Ta program bo na zaslonu prikazal naslednje informacije:

Program se prične ob 10:28:41. Končano z zamudo 1. Končano z zamudo 3.

Pomen je, da je PHP zagnal dva neodvisna podprocesa, prejel podatke od prvega in nato od drugega, čeprav se je slednji začel prej. Če je gostiteljski računalnik večprocesorski in operacijski sistem pravilno konfiguriran, poskrbi za dodelitev različnih podprogramov različnim procesorjem. To je eden od načinov za izkoriščanje večprocesnih strojev v PHP.

Povzetek

PHP podpira večopravilnost. PHP ne podpira obdelave toka na način, kot to počnejo drugi programski jeziki, kot sta Java ali C++, vendar so zgornji primeri pokazali, da ima PHP več možnosti za pospešitev, kot se mnogi zavedajo.


Torej, prijatelji, če ste dosegli to lekcijo, vam je uspelo namestiti lokalni strežnik, ali kupite gostovanje, kjer lahko delate s PHP. Čestitamo - to je velik korak!

Na kratko bom povedal o PHP - ta programski jezik se uporablja povsod po svetu in na njem lahko ustvarite spletna mesta vseh stopenj kompleksnosti, od spletnih strani z vizitkami do velikih portalov. Mislim, da za mnoge ni več skrivnost, da je največji socialna omrežja facebook.com(iz nič v php) in vk.com(motor v php) so bili napisani v PHP. Torej naredimo zaključke in začnimo delati!)

Kako koda deluje

PHP koda obdelana na strani strežnika. To pomeni, da ni končane strani. Na primer, v kodi je podan ukaz za zbiranje podatkov o tem, na koliko uporabnikov je registriranih ta trenutek na strani. Obiskovalec spletne strani klikne na povezavo Vsi uporabniki. Želi dobiti dinamični podatki, torej tiste, ki se nenehno spreminjajo. Po končanem izračunu na strežniku bodo s strežnika prišli podatki v obliki generirane HTML kode strani s številom uporabnikov. Kot rezultat, po kliku-zahteva na povezavo, uporabnik prejme stran. Če si ogledate kodo nastale strani, lahko vidite samo HTML, koda PHP pa ne bo na voljo za ogled. Grobo rečeno, PHP je navodila strežniku, kako in iz katerih blokov narediti stran.

Kako izgleda koda PHP in kam naj jo prilepim?

PHP kodo je mogoče vdelati neposredno v HTML. PHP koda je vdelana v strani HTML z uporabo kotnih oklepajev in vprašaja , lahko pa se omejite na oklepaje z vprašajem . Spremeniti boste morali samo pripono datoteke, na primer from .html na .php

PHP koda(mapa index.php)



Primer <a href="https://appcube.ru/sl/ispolzovanie-mysql-v-php-osnovy-raboty-s-mysql-v-php-podklyuchenie-k-baze.html">Uporaba PHP</a>


odmev "Pozdravljeni svet!";
?>



Demonstracija Prenesite vire
Rezultat kode bo izhod golega besedila Pozdravljen, svet!. Vprašajte, zakaj napisati php kodo za prikaz golega besedila? odmevna izjava, o katerem bomo govorili malo kasneje, je potreben za več kot le prikazovanje besedila. Pogosteje se odmev uporablja za prikaz rezultata neke funkcije, ki je izvedla izračun ali prevzela podatke iz baze podatkov (Kaj je baza podatkov?). To je za dinamični prikaz podatkov.

izjava echo v PHP

Kot ste že razumeli, operater odmev potrebno za izpis podatkov. Prevzamemo vsebino (v našem primeru zaenkrat samo besedilo). citati in konča s podpičjem ; to pomeni konec dela operaterja.

Pri programiranju je pri ustvarjanju prve strani običajno uporabiti besedno zvezo Pozdravljen, svet!- to je Pozdravljen, svet! To je tisto, kar uporabljamo. V primeru ne bomo uporabljali html, saj to ni potrebno.

PHP koda

odmev "Pozdravljeni svet!";
?>
Program bo izpisal Pozdravljen, svet!.
V prvem primeru smo v html vstavili majhno php kodo. Zdaj, nasprotno, vstavimo elemente html v kodo php.

PHP koda

odmev " ";
odmev " ";
odmev " Moj prvi <a href="https://appcube.ru/sl/skript-elektronnoi-pochty-gotovye-php-email-sistemy-i-skripty-dlya.html">PHP skript</a>";
odmev "";
odmev " ";
odmev "

Pozdravljen, svet!

";
odmev "";
?>
Kot rezultat dobimo prazno stran z naslovom Pozdravljen, svet!

stavek za tiskanje v PHP

Za razliko od izjave echo tiskanje izpiše podatke, vključno s presledki in prelomi besedila. Ima nekaj omejitev - uporabite lahko samo en argument, odmeva več. Traja dlje kot odmev. V prihodnosti se bomo pri pisanju funkcij zatekali k temu operaterju.

natisni "Pozdravljeni svet!
Druga vrstica besedila"; // rezultat bo prikazan v dveh vrsticah
?>
Besedilo bo prikazano na enak način, kot je napisano.

Izhodni stavek - sintaksa PHP heredoc

Kot ste že opazili, je prikazovanje strani z nenehno uporabo izjave echo grdo in neberljivo. Zato za proizvodnjo velikih delov html kodo in obstaja še en izhodni stavek, ki uporablja sintakso heredoc. Prav tako izpiše podatke v enaki obliki, kot je bila (presledki in vezaji).

odmev<<

Primer


Primer izpisa velike količine besedila z uporabo html


Drugi odstavek istega obsežnega besedila.


TUKAJ;
?>

Opomnik za lekcijo

PHP koda lahko:

1. ne vsebuje nobenega elementa html. Stran in besedilo bosta še vedno prikazana. html je potreben za lepo označevanje vsebine.

2. biti vključeni v kodo html in jo vsebovati znotraj svojih izhodnih stavkov (odmev, tiskanje itd.). Glavna stvar je, da ne pozabite na dizajn

3. strani s kodo php morajo imeti ustrezno razširitev: .php .phtml

Od naslednjih lekcij bomo analizirali osnove izdelave spletnih strani v php, v katerih boste videli vse prednosti uporabe tega jezika!

Hvala za vašo pozornost!

Lep dan vsem. To je prvi članek v seriji PHP za razvijalce začetnike. To bo nenavadna serija člankov, ne bo odmeva "Hello World" , bo hardcore iz življenja PHP programerjev z malo "domače naloge" za utrjevanje gradiva.

Začel bom s sejami - to je ena najpomembnejših komponent, s katerimi boste morali delati. Ne razume načel njegovega dela - poslujte. Da bi se izognili težavam, bom poskušal govoriti o vseh možnih niansah.

Toda najprej, da bi razumeli, zakaj potrebujemo sejo, se obrnimo na izvore - na protokol HTTP.

protokol HTTP

Protokol HTTP je HyperText Transfer Protocol - "hypertext transfer protocol" - t.j. pravzaprav - besedilni protokol in razumeti ga ne bo težko.

Sprva je bilo predvideno, da se bo s tem protokolom prenašal samo HTML, od tu naprej in ime, zdaj pa ne pošiljajo ničesar ( _ㅅ_ )=^.^=

Da se ne bi prepirali, naj vam navedem primer komunikacije prek protokola HTTP, tukaj je zahteva, kot jo vaš brskalnik pošlje, ko zahtevate stran http://example.com:

GET / HTTP/1.1 Host: example.com Sprejmi: besedilo/html ... prazen niz...

In tukaj je primer odgovora:

HTTP/1.1 200 OK Dolžina vsebine: 1983 Vrsta vsebine: besedilo/html; charset=utf-8 ... ...

To so zelo poenostavljeni primeri, toda tukaj lahko vidite, iz česa sta sestavljena zahteva in odgovor HTTP:

  1. startna črta- za zahtevo vsebuje metodo in pot zahtevane strani, za odgovor - različico protokola in odzivno kodo
  2. naslovi- naj bodo ključ/vrednost formata ločeni z dvopičjem, vsak nov naslov je napisan v novi vrstici
  3. telo sporočila- neposredno HTML ali podatki so ločeni od glav z dvema prelomoma vrstic, lahko so odsotni, kot v zgornji zahtevi

Torej, zdi se, da smo ugotovili protokol - preprost je, svojo zgodovino vodi že od leta 1992, tako da ga ne morete imenovati idealnega, ampak kaj je - pošljite zahtevo - dobite odgovor in to je to, strežnik in odjemalec nista več povezana na noben način. A takšen scenarij nikakor ni edini možen, lahko imamo avtorizacijo, strežnik mora nekako razumeti, da je ta zahteva prišla od določenega uporabnika, t.j. odjemalec in strežnik morata komunicirati znotraj določene seje. In ja, za to so pripravili naslednji mehanizem:

  1. pri avtorizaciji uporabnika strežnik generira in si zapomni edinstven ključ - identifikator seje ter ga poroča brskalniku
  2. brskalnik shrani ta ključ in ga ob vsaki naslednji zahtevi pošlje

Za izvajanje tega mehanizma so bili ustvarjeni (piškotki, piškotki) - preprosto besedilne datoteke na vašem računalniku datoteka za vsako domeno (čeprav so nekateri brskalniki naprednejši in za shranjevanje uporabljajo bazo podatkov SQLite), medtem ko brskalnik nalaga omejitev števila zapisov in velikosti shranjenih podatkov (za večino brskalnikov je to 4096 bajtov, glej RFC 2109 iz 1997)

tiste. če je piškotek ukraden iz vašega brskalnika, ali bo mogoče v vašem imenu obiskati vašo facebook stran? Brez skrbi, tega ne zmorete, vsaj s facebookom, potem pa vas bom naučil, kako se zaščititi pred tovrstnim napadom na vaše uporabnike.

Poglejmo zdaj, kako se bo spremenila naša zahteva-odgovor, če obstaja pooblastilo:

POST /login/ HTTP/1.1 Host: example.com Sprejmi: text/html login=Uporabniško ime&password=Userpass

Naša metoda se je spremenila v POST, v telesu zahteve pa posredujemo prijavo in geslo (če uporabimo Metoda GET, potem bo niz poizvedbe vseboval uporabniško ime in geslo ter bo morda shranjen na nekaterih vmesnih proxy strežnikih, kar je zelo slabo).

HTTP/1.1 200 OK Vrsta vsebine: besedilo/html; charset=utf-8 Set-Cookie: KEY=VerySecretUniqueKey ... ...

Odgovor strežnika bo vseboval glavo Set-Cookie: KEY=VerySecretUniqueKey , ki bo brskalnik prisilil, da te podatke shrani v piškotke, in ko bo naslednjič vzpostavljen stik s strežnikom, jih bo strežnik poslal in prepoznal:

GET / HTTP/1.1 Host: example.com Sprejmi: text/html Piškotek: KEY=VerySecretUniqueKey ...prazen niz...

Kot lahko vidite, so glave, ki jih pošljeta brskalnik (glave zahtev) in strežnik (glave odgovora), različne, čeprav obstajajo skupne za zahteve in odgovore (splošne glave)

Strežnik je našega uporabnika prepoznal po poslanih piškotkih in mu nato omogočil dostop do osebne informacije. Torej, zdi se, da smo ugotovili seje in HTTP, zdaj se lahko vrnemo k PHP in njegovim funkcijam.

PHP in seja

Upam, da že imate nameščen PHP na vašem računalniku. nadalje bom navedel primere in jih bo treba zagnati

Jezik PHP je bil ustvarjen tako, da se ujema s protokolom HTTP – t.j. njegova glavna naloga je dati odgovor na zahtevo HTTP in "umreti" ter sprostiti pomnilnik in vire. Zato mehanizem seje deluje v PHP in ne v avtomatski način, vendar v priročniku, in morate vedeti, kaj poklicati in v kakšnem vrstnem redu.

Najprej morate "začeti" sejo - za to bomo uporabili funkcijo session_start(), ustvarili datoteko session.start.php z naslednjo vsebino:

začetek_seje();

In zdaj - posodobimo stran in vidimo, da brskalnik pošlje ta piškotek strežniku, lahko poskusite nekajkrat osvežiti stran, rezultat bo enak:

Na splošno imamo to, da je teorija sovpadala s prakso, in to je čisto v redu.

Naslednji korak je, da v sejo shranite poljubno vrednost, saj ta PHP uporablja superglobalno spremenljivko $_SESSION, shranili bomo Trenutni čas– če želite to narediti, pokličite funkcijo date():

začetek_seje(); $_SESSION["čas"] = datum("H:i:s"); echo $_SESSION["čas"];

Osvežimo stran in vidimo čas strežnika, ponovno ga posodobimo - in čas je posodobljen. Naj bo zdaj tako nastavi čas se ni spremenilo ob vsaki osvežitvi strani:

začetek_seje(); if (!isset($_SESSION["time"])) ( $_SESSION["time"] = date("H:i:s"); ) echo $_SESSION["time"];

Posodabljamo - čas se ne spremeni, kar je potrebno. Toda hkrati se spomnimo, da PHP umira, kar pomeni, da nekje shrani to sejo in to mesto bomo našli ...

Vsa skrivnost postane jasna

PHP privzeto shrani sejo v datoteke - za to je odgovorna direktiva session.save_handler, poiščite pot, kamor so datoteke shranjene v direktivi session.save_path, ali uporabite funkcijo session_save_path(), da dobite potrebno pot.

V vaši konfiguraciji pot do datotek morda ni določena, potem bodo datoteke seje shranjene v začasnih datotekah v vašem sistemu - pokličite funkcijo sys_get_temp_dir() in ugotovite, kje je to skrito mesto.

Torej sledimo tej poti in najdemo vašo datoteko seje (imam datoteko sess_dap83arr6r3b56e0q7t5i0qf91), jo odpremo v urejevalnik besedil:

Čas|s:8:"16:19:51";

Kot lahko vidite, je to naš čas, to je zapletena oblika, v kateri je shranjena naša seja, vendar lahko spremenimo, spremenimo čas ali pa preprosto vnesemo katero koli vrstico, zakaj ne:

Čas|s:13:"\m/ (@ [email protected])\m/";

Če želite ta niz pretvoriti v matriko, morate uporabiti funkcijo session_decode(), da ga pretvorite nazaj - session_encode() - to se imenuje serializacija, vendar v PHP za seje - ima svoje - posebno, čeprav lahko uporabite tudi standardna PHP serializacija - zapišite jo v konfiguracijsko direktivo seje .serialize_handler vrednost php_serialize in boste zadovoljni, $_SESSION pa lahko uporabljate brez omejitev - zdaj lahko uporabite številke kot indeks in Posebni simboli| in! v imenu (za vseh 10+ let dela ni bilo nikoli potrebno :)

Vaja
Napišite svojo funkcijo, podobno po funkcionalnosti kot session_decode(), tukaj je nabor testnih podatkov za sejo (za njeno rešitev ni potrebno poznavanje regularnih izrazov), vzemite besedilo za pretvorbo iz vaše trenutne datoteke seje:

$_SESSION["celo število var"] = 123; $_SESSION["float var"] = 1,23; $_SESSION["oktalna varianta"] = 0x123; $_SESSION["string var"] = "Pozdravljeni svet"; $_SESSION["array var"] = ["ena", "dva", ]; $object = nov stdClass(); $object->foo = "bar"; $object->arr = ["zdravo", "svet"]; $_SESSION["object var"] = $object; $_SESSION["zopet celo število"] = 42;

Česa torej še nismo poskusili? Tako je – ukradi "piškotke", zaženimo drug brskalnik in mu dodamo iste piškotke. Za to sem napisal preprost javascript, ga kopirajte v konzolo brskalnika in ga zaženite, samo ne pozabite spremeniti ID-ja seje v svojega:

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

Zdaj imate oba brskalnika, ki gledata isto sejo. Zgoraj sem omenil, da bom govoril o metodah zaščite, upošteval najpreprostejši način - sejo bomo povezali z brskalnikom, natančneje, s tem, kako je brskalnik predstavljen strežniku - zapomnili si bomo uporabniškega agenta in ga vsakič preverili :

začetek_seje(); if (!isset($_SESSION["time"])) ( $_SESSION["ua"] = $_SERVER["HTTP_USER_AGENT"]; $_SESSION["time"] = date("H:i:s"); ) if ($_SESSION["ua"] != $_SERVER["HTTP_USER_AGENT"]) ( die("Napačen brskalnik"); ) echo $_SESSION["čas"];

To je težje ponarediti, vendar je še vedno mogoče, tukaj dodajte shranjevanje in preverjanje $_SERVER["REMOTE_ADDR"] in $_SERVER["HTTP_X_FORWARDED_FOR"] in bo bolj ali manj videti kot zaščita pred vsiljivci, ki posegajo v naše "piškotke".

Ključna beseda v prejšnjem odstavku izgleda, v resničnih projektih piškotki že dolgo »tečejo« po protokolu HTTPS, zato jih nihče ne more ukrasti brez fizičnega dostopa do vašega računalnika ali pametnega telefona

Vaja
Kodi dodajte preverjanje za IP uporabnika, če preverjanje ne uspe, izbrišite ogroženo sejo.

korak za korakom

Zdaj bom korak za korakom razložil algoritem, kako seja deluje v PHP, z uporabo naslednje kode kot primera (privzete nastavitve):

začetek_seje(); $_SESSION["id"] = 42;

  1. po klicu session_start() PHP išče piškotek za ID seje z imenom, navedenim v session.name - to je PHPSESSID
  2. če ni identifikatorja, se ustvari (glej session_id ()) in ustvari prazna datoteka seje vzdolž poti session.save_path z imenom sess_(session_id()) bodo v odgovor strežnika dodane glave za nastavitev piškotka (session_name())=(session_id())
  3. če je identifikator prisoten, poiščite datoteko seje v mapi session.save_path:
    • če ga ne najdemo, ustvarimo prazno datoteko z imenom sess_($_COOKIE) (identifikator lahko vsebuje samo znake iz obsegi a-z, A-Z , 0-9 , vejica in znak minus)
    • poiščite, preberite datoteko in razpakirajte podatke (glejte session_decode()) v superglobalno spremenljivko $_SESSION
  4. ko skript konča svoje delo, se vsi podatki iz $_SESSION s pomočjo session_encode() pakirajo v datoteko vzdolž poti session.save_path z imenom sess_(session_id())

Vaja
Nastavite brskalnik na poljubno vrednost piškotka, imenovano PHPSESSID, naj bo 1234567890, osvežite stran, preverite, kaj ste ustvarili nova datoteka sess_1234567890

Ali obstaja življenje brez piškotkov?

PHP lahko deluje s sejo, tudi če so piškotki v brskalniku onemogočeni, vendar bodo potem vsi URL-ji na spletnem mestu vsebovali parameter z vašim identifikatorjem seje, in da - to je še vedno treba konfigurirati, vendar ga potrebujete? Ni mi ga bilo treba uporabiti, a če res želiš, ti bom samo povedal, kje kopati:

In če morate sejo shraniti v bazo podatkov?

Če želite sejo shraniti v bazo podatkov, boste morali spremeniti pomnilnik seje in povedati PHP-ju, kako ga uporablja, vmesnik SessionHandlerInterface in funkcija session_set_save_handler sta bila ustvarjena za ta namen.

Ločeno ugotavljam, da vam ni treba pisati lastnih upravljavcev sej za redis in memcache - ko namestite te razširitve, pridejo z njimi ustrezni upravljavci, tako da je RTFM naše vse. No, ja, pred klicem session_start() je treba navesti obdelovalca ;)

Vaja
Implementirajte SessionHandlerInterface, da zadržite sejo v MySQL, preverite, ali deluje.
Ta naloga z zvezdico je za tiste, ki že poznajo baze podatkov.

Kdaj seja umre?

Zanimivo vprašanje, lahko ga postavite izkušenim razvijalcem – kdaj PHP izbriše datoteke seje, ki so potekle? Odgovor je v uradnem priročniku, vendar ne izrecno - zato ne pozabite:

Zbiralnik smeti (zbiranje smeti) se lahko zažene s klicem funkcije session_start(), verjetnost zagona je odvisna od dveh direktiv session.gc_probability in session.gc_divisor, prva deluje kot dividenda, druga kot delilec in privzeto ti vrednosti sta 1 in 100, tj. verjetnost, da se bo zbiralnik zagnal in da bodo datoteke seje izbrisane, je približno 1%.

Vaja
Spremenite vrednost direktive session.gc_divisor, tako da se zbiralnik smeti zažene vsakič, preverite, ali je temu tako.

Najbolj trivialna napaka

Napaka, ki ima več kot pol milijona rezultatov v Googlovih rezultatih:

Ni mogoče poslati piškotka seje - glave so že poslane od
Omejevalnika predpomnilnika seje ni mogoče poslati - glave so že poslane

Če ga želite dobiti, ustvarite datoteko session.error.php z naslednjo vsebino:

echo str_pad(" ", ini_get("output_buffering")); začetek_seje();

V drugi vrstici je nenavadna "čarovnija" trik z izhodnim medpomnilnikom, o tem bom govoril v enem od naslednjih člankov, zaenkrat menite, da je le niz dolg 4096 znakov, v tem primeru so to vsi presledki

Zaženite ga po izbrisu piškotka in dobili boste prikazane napake, čeprav je besedilo napak drugačno, a bistvo je isto - vlak je odšel - strežnik je vsebino strani že poslal brskalniku in je prepozno za pošiljanje glav, to ne bo delovalo in želeni identifikator seje se ni pojavil v piškotkih. Če naletite na to napako, poiščite mesto, kjer je prikazano besedilo
pred časom, lahko je presledek pred znakiv eni od priloženih datotek, in v redu, če je presledek, je morda kakšen znak, ki ga ni mogoče natisniti, kot je BOM , zato bodite previdni in ta okužba vas ne bo prizadela (no, ... Homerov smeh).

Vaja
Za preverjanje vašega znanja želim, da implementirate lasten mehanizem seje in naredite naslednjo kodo za delovanje:

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

Za izvedbo svojega načrta potrebujete funkcijo register_shutdown_function ().

končno

V tem članku vam je danih šest nalog, ki se ne nanašajo samo na delo s sejami, ampak vas tudi seznanjajo z MySQL in funkcijami dela z nizi. Za asimilacijo tega gradiva - ločen članek ni potreben, dovolj je priročnik na priloženih povezavah - nihče ga ne bo prebral namesto vas. Drzni se!

P.S. Če ste se iz članka naučili nekaj novega - hvala avtorju - delite članek na družbenih omrežjih;)

Če ste pravkar naleteli na PHP, potem morate poznati nekaj definicij.
Prvič, PHP je programski jezik in služi za pisanje ukazov (skriptov), ​​naslovljenih na strežnik. Še bolj preprosto, s pomočjo PHP lahko komuniciramo s strežnikom.
Ukaze PHP je enostavno vdelati v strani HTML. Ta lastnost je pomembna prednost PHP jezik pred jeziki, kot sta Perl in C.

Sintaksa PHP

Koda PHP skripta se začne po odprtju oznake. Besedilo med tema dvema oznakama prebere program, ki se nahaja na strežniku, rezultat pa je prikazan v dokumentu HTML. Poglejmo primer:



Primer

include("sidebar.htm") ;
?>


Če moramo nekaj vstaviti v html kodo strani, moramo uporabiti ukaz include (insert). Nato določite naslov datoteke in vrstica se konča, kot v CSS;

Vstavljanje HTML kode na spletne strani

Praviloma stranski stolpci ( stranska vrstica) in klet ( nogo) ostanejo nespremenjeni na vseh straneh spletnega mesta. Od tod kode

.....
in lahko vzamete v ločeni strani htm "sidebar.htm" in "footer.htm" in vstavite na strani spletnega mesta z ukazom include. Če se hkrati glavna vsebina odstrani v ločeno datoteko -
.....
, potem bo naša koda strani videti takole:



Primer

include("sidebar.htm") ;
include("content.htm") ;
include("footer.htm") ;
?>


vsebina sidebar.htm


tukaj
vsebino
Tvoja njegova
stranska vrstica

Podobno z datotekami content.htm in footer.htm.

S to generacijo strani morate samo spremeniti eno datoteko "sidebar.htm", da spremenite vse strani spletnega mesta. Kar je zelo priročno, če je vaše spletno mesto sestavljeno iz sto ali tisoč strani.

PHP na vašem računalniku

Če želite delati s skripti PHP in si ogledati rezultate izvajanja v brskalniku, morate na svoj lokalni računalnik namestiti delujoč spletni strežnik s PHP.
Denver je najbolj primeren za takšne naloge. (uradna stran ponuja vse, kar potrebujete je brezplačen) Namestitveni komplet vključuje - Apache, php in MySQL. Z drugimi besedami, vaš računalnik bo imel strežnik za gostovanje spletnih mest s polnimi funkcijami.

Da bi koda PHP delovala na straneh HTML, morate odpreti datoteko .htaccess v katerem koli urejevalniku besedil in napišite naslednje:

Aplikacija AddHandler/x-httpd-php .html

Ta vnos dovoljuje Izvedba PHP skripte na straneh HTML.

Ali pa spremenite pripono datoteke. html na. php

funkcije PHP

PHP je sposoben več kot le upodabljati HTML. Funkcije PHP vključujejo ustvarjanje slik, datotek PDF in celo filmov Flash (z uporabo libswf in Ming), ustvarjenih sproti. PHP lahko tudi upodablja vse besedilne podatke, kot so XHTML in druge datoteke XML. PHP lahko samodejno ustvari takšne datoteke in jih shrani datotečni sistem vaš strežnik, namesto da bi ga servirali odjemalcu, s čimer ustvarite dinamični predpomnilnik vsebine na strani strežnika.

Ena od pomembnih prednosti PHP je njegova podpora za širok nabor baz podatkov. Skratka, PHP vam lahko ponudi veliko! Podrobnosti o prednostih PHP lahko najdete na www.php.su.

1. februar 2015


Ko začnejo pisati programe za splet, se mnogi programerji začetniki srečajo s to napako. Sistem brskalnika in strežnika obravnavajo kot običajno aplikacijo. Interaktivno. Pritisnil gumb - sistem se je odzval. Držal miško - reagiral. Programu so na voljo tudi vse informacije, ki so na voljo odjemalcu, program je vedno v pomnilniku.
Torej v spletnem programiranju to ni res!.
V trenutku, ko uporabnik zagleda stran pred seboj in začne z njo izvajati nekatera dejanja, PHP je že dokončan! In uporabnik ne komunicira s skriptom PHP, ampak s svojo stranjo HTML, ki jo je prejel v brskalniku. Rezultat PHP skripta je v večini primerov golo besedilo. Besedilo strani HTML. Ki se da brskalniku in se jim prikaže kot običajen HTML. To lahko preverite sami, tako da vpišete v skript
"Zdravo, Vasya!" ; ?> ;
In nato ogled izvornega besedila nastale strani v brskalniku. Ni PHP oznak! Samo
Zdravo, Vasya!
Ker PHP deluje na strežniku!

Strežnik in brskalnik komunicirata tako, da drug drugemu pošiljata zahteve po posebnem protokolu - HTTP. Povezavo lahko vzpostavi samo brskalnik. Strežniku pošlje zahtevo - da pokaže takšno in drugačno datoteko. Strežnik pošlje datoteko odjemalcu.
Samo tako se to zgodi. Stranka je zahtevala - strežnik je dal. In takoj sem pozabil na stranko. Od tu postane jasen odgovor na vprašanje, ali je mogoče natančno vedeti, koliko uporabnikov je trenutno na spletnem mestu. To je prepovedano. ker "na mestu" ga ni. Povezujejo se, zahtevajo stran in prekinejo povezavo. Nimajo stalne povezave s strežnikom, kot na primer igralci v Kwakuju. Približno lahko ugotovite le tako, da zabeležite čas posamezne povezave in izberete zapise za določeno časovno obdobje.

Primer komunikacije brskalnika s strežnikom:
Uporabnik klikne na povezavo, brskalnik pošlje zahtevo strežniku in počaka na odgovor:
Brskalnik -> PHP
PHP izvede skript, pošlje rezultat v brskalnik in zapusti:
PHP -> brskalnik
Brskalnik stran upodablja tako, da na njej "išče" povezave, ki jih je treba zahtevati od strežnika (oznake ,