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 .phpPHP koda(mapa index.php)
odmev "Pozdravljeni svet!";
?>