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 .phpPHP kod(datoteka index.php)
eho "Zdravo svijete!";
?>