Vytváření html stránek pomocí PHP. Jaký je rozdíl mezi souborem php a souborem html Co potřebujete vědět
Cameron Laird
PHP nepodporuje zpracování streamů. Bez ohledu na to, a na rozdíl od názoru většiny vývojářů PHP, se kterými jsem mluvil, mohou aplikace PHP provádět více úloh najednou. Začněme tím, že zjistíme, co pro programování v PHP znamená „multitasking“ a „threading“.
Rozmanitost paralelismu
Nejprve dáme stranou případy, které leží mimo hlavní proud hlavního tématu. PHP má komplexní vztah k multitaskingu nebo souběžnosti. Na nejvyšší úrovni je PHP neustále zapojeno do multitaskingu - standardní instalace PHP na serveru (jako modul Apache) se používají multitaskingovým způsobem. To znamená, že více klientských aplikací (webových prohlížečů) může požadovat stejnou PHP stránku současně a webový server ji vrátí všem víceméně současně.
Jedna webová stránka neblokuje přenos jiné, i když se mohou navzájem mírně rušit při práci s omezenými zdroji, jako je paměť serveru nebo šířka pásma sítě. Systémový požadavek na souběžnost tedy může dobře umožnit řešení založená na PHP. Pokud jde o implementaci, PHP považuje webový server za zodpovědný za souběžnost.
Paralelismus na straně klienta zvaný Ajax také upoutal pozornost vývojářů v posledních několika letech. Zatímco význam Ajaxu se stal poněkud nejasným, jedním z aspektů této technologie je, že prohlížeč může provádět výpočty současně a zůstat citlivý na akce uživatele, jako je výběr z nabídky. Je to opravdu druh multitaskingu. PHP kódovaný Ajax to dělá, ale bez jakéhokoli zvláštního zapojení PHP; Rámce Ajax pro jiné jazyky fungují stejným způsobem.
Třetím příkladem souběžnosti, která pouze poškrábe povrch PHP, je PHP / TK. PHP / TK je rozšíření PHP, které poskytuje přenosné vazby grafického uživatelského rozhraní (GUI) k jádru PHP. PHP / TK umožňuje vytvářet desktopové GUI aplikace napsané v PHP. Jeho aspekty řízené událostmi simulují formu souběžnosti, která se snadno učí a je méně náchylná k chybám než práce s vlákny. Opět platí, že souběžnost je „zděděna“ spíše z doplňkové technologie než ze základní funkčnosti PHP.
Bylo provedeno několik experimentů, jak přidat podporu vláken do samotného PHP. Pokud vím, žádný nebyl úspěšný. Událostmi řízené rámce Ajax a PHP / TK však ukazují, že události mohou pro PHP vyjádřit souběžnost ještě lépe než vlákna. PHP V5 to dokazuje.
PHP V5 nabízí stream_select ()
Ve standardním PHP V4 a dřívějších musí být veškerá práce PHP aplikace prováděna postupně. Pokud program potřebuje získat cenu položky například ze dvou komerčních stránek, požádá o první cenu, čeká na odpověď, požádá o druhou cenu a znovu čeká.
Co když program dokáže vykonávat více úkolů současně? Bylo by hotovo za zlomek času potřebného pro důslednou práci.
První příklad
Nová funkce stream_select spolu s několika jejími přáteli tuto možnost poskytuje. Zvažte následující příklad:
0) ($ s = stream_socket_client ("phaseit.net:80", $ errno, $ errstr, $ timeout, STREAM_CLIENT_ASYNC_CONNECT / STREAM_CLIENT_CONNECT); if ($ s) ($ sockety [$ id ++] = $ s; $ http_message = " GET / ukázka / zpoždění? Zpoždění = ". $ Zpoždění." HTTP / 1.0 \ r \ nHost: phaseit.net \ r \ n \ r \ n "; fwrite ($ s, $ http_message);) else (echo "Stream ". $ id." se nepodařilo správně otevřít. ";) $ delay - = 3;) while (count ($ sockets)) ($ read = $ sockets; stream_select ($ read, $ w = null, $ e = null , $ timeout); if (count ($ read)) (/ * stream_select obvykle zamíchá $ read, takže musíme zjistit, ze kterého soketu čte. * / foreach ($ čteno jako $ r) ($ id = array_search ($ r, $ sockets); $ data = fread ($ r, $ Comfort_read_block); / * Soket lze číst buď proto, že má data ke čtení, NEBO protože je ve stavu EOF. * / if (strlen ($ data) = = 0) (ozvěna "Stream". $ Id. "Zavírá v". Datum ("h: i: s"). ". \ N"; fclose ($ r); nenastaveno ($ sokety [ $ id]); ) else ($ výsledek [$ id]. = $ data;))) else (/ * Ty maut znamená, že * všechna * vlákna nečekala na odpověď. * / echo "Vypršel časový limit! \ n"; přestávka; ))?> |
Pokud tento program spustíte, zobrazí se informace podobné následujícím:
Program začíná v 02:38:50. Stream 4 se uzavírá v 02:38:53. Stream 3 se uzavírá v 02:38:56. Stream 2 se uzavírá v 02:38:59. Stream 1 se uzavírá v 02:39:02. Stream 0 se uzavírá v 02:39:05. |
Je důležité pochopit, co se zde děje. Na vysoké úrovni provede první program několik požadavků HTTP a přijímá stránky, které mu webový server posílá. Zatímco skutečná aplikace by pravděpodobně požadovala několik různých webových serverů (možná google.com, yahoo.com, ask.com atd.), tento příklad předává všechny požadavky našemu podnikovému serveru na Phaseit.net, aby se snížila složitost. ...
Požadované webové stránky vrátí výsledky po proměnlivém zpoždění uvedeném níže. Pokud by program spouštěl požadavky postupně, dokončení by trvalo asi 15 + 12 + 9 + 6 + 3 (45) sekund. Jak je uvedeno ve výpisu 2, dokončení ve skutečnosti trvá 15 sekund. Trojnásobná produktivita je skvělý výsledek.
To je možné díky stream_select, nové funkci v PHP V5. Požadavky jsou iniciovány obvyklým způsobem - otevřením několika stream_socket_clients a napsáním GET pro každého z nich, což odpovídá http://phaseit.net/demonstration/delay?delay=$DELAY. Když ve svém prohlížeči požádáte o tuto adresu URL, měli byste vidět:
Ačkoli konkrétní implementace ve Výpisu 3 je pro UNIX®, téměř všechny skripty v tomto článku lze stejně dobře použít pro instalace PHP na Windows® (zejména po Windows 98) nebo UNIX. Zejména můžete pracovat s výpisem 1 na jakémkoli operačním systému. Linux® a Mac OS X jsou varianty UNIXu a veškerý kód zde bude fungovat na obou systémech.
Požadavky serveru s latencí se zadávají v následujícím pořadí:
zpoždění = 15 zpoždění = 12 zpoždění = 9 zpoždění = 6 zpoždění = 3 |
Cílem stream_select je získat výsledky co nejrychleji. V tomto případě je pořadí zpoždění opačné, než v jakém byly žádosti podány. Po 3 sekundách je první stránka připravena ke čtení. Tato část programu je normální PHP kód - v tomto případě s freadem. Stejně jako v jiném PHP programu lze čtení provést pomocí fgets.
Zpracování pokračuje stejným způsobem. Program blokuje na stream_select, dokud nejsou data připravena. Rozhodující je, že začne číst, jakmile má jakékoli připojení data, v libovolném pořadí. Takto program implementuje multitasking nebo paralelní zpracování výsledků více dotazů.
Všimněte si, že na hostitelském počítači není žádné další zatížení CPU. Není neobvyklé, že síťové programy provádějí fread tímto způsobem, aby brzy využily 100 % CPU. Zde tomu tak není, protože stream_select má požadované vlastnosti a reaguje okamžitě, jakmile je možné jakékoli čtení, ale také minimálně zatěžuje CPU v pohotovostním režimu mezi čteními.
Co potřebujete vědět o stream_select ()
Toto programování založené na událostech není triviální. Přestože byl Výpis 1 zredukován na to nejpodstatnější, jakékoli kódování založené na zpětných voláních nebo koordinaci (které je nezbytné v multitaskingových aplikacích) bude méně známé než jednoduchá procedurální sekvence. V tomto případě spočívá největší problém v poli $ read. Upozorňujeme, že toto je odkaz; stream_select vrací důležité informace úpravou obsahu $ read. Stejně jako ukazatele mají pověst stálého zdroje chyb v C, zdají se být odkazy pro programátory nejobtížnější částí PHP.
Tuto techniku dotazu lze použít z libovolného počtu externích webových stránek, což zajišťuje, že program obdrží každý výsledek co nejrychleji, aniž by čekal na další požadavky. Ve skutečnosti tato technika funguje správně s jakýmkoli připojením TCP / IP, nejen s webem (port 80), to znamená, že v zásadě můžete ovládat extrakci dat LDAP, přenos SMTP, požadavky SOAP atd.
Ale to není vše. PHP V5 zpracovává různá připojení jako "streamy" spíše než jednoduché zásuvky. PHP Client URL Library (CURL) podporuje HTTPS certifikáty, odchozí FTP uploady, cookies a další (CURL umožňuje PHP aplikacím používat různé protokoly pro připojení k serverům). Vzhledem k tomu, že CURL poskytuje streamové rozhraní, je spojení transparentní z pohledu programu. Další část vysvětluje, jak stream_select multiplexuje i místní výpočty.
Stream_select má několik upozornění. Tato funkce není zdokumentována, takže ji nepokrývají ani nové knihy o PHP. Několik příkladů kódu dostupných na webu prostě nefunguje nebo není srozumitelné. Druhý a třetí argument stream_select, které řídí kanály pro zápis a výjimku odpovídající čtecím kanálům ve výpisu 1, by měly být téměř vždy nulové. Až na pár výjimek je výběr těchto kanálů chybou. Pokud nejste dostatečně zkušení, používejte pouze dobře popsané možnosti.
Také stream_select se zdá být chybný, alespoň v PHP V5.1.2. A co je nejdůležitější, návratové hodnotě funkce nelze věřit. I když jsem implementaci ještě neodladil, moje zkušenost ukázala, že je bezpečné testovat počet ($ read) jako ve výpisu 1, ale to se netýká samotné návratové hodnoty stream_select, navzdory oficiální dokumentaci.
Místní souběžnost PHP
Příklad a většina diskuse výše se zaměřily na to, jak spravovat více vzdálených zdrojů současně a získávat výsledky tak, jak se objevují, než čekat na zpracování každého z nich v pořadí původního požadavku. Toto je bezpochyby důležitá aplikace souběžnosti PHP. Někdy lze skutečné aplikace zrychlit desetkrát i vícekrát.
Co když ke zpomalení dojde blíž? Existuje způsob, jak urychlit získávání výsledků v PHP při místním zpracování? Je tu pár. Jsou možná ještě méně známé než přístup orientovaný na zásuvky ve výpisu 1. Existuje pro to několik důvodů, včetně:
- Stránky PHP jsou z velké části dostatečně rychlé. Lepší výkon by mohl být výhodou, ale ne natolik, aby ospravedlnil investici do nového kódu.
- Použití PHP na webových stránkách může způsobit, že částečné zrychlení kódu nebude relevantní. Přerozdělení výpočtů pro rychlejší získání mezivýsledků je irelevantní, když jediným kritériem je rychlost doručení webové stránky jako celku.
- Jen málo místních úzkých míst je řízeno PHP. Uživatelé si mohou stěžovat, že načtení informací o účtu trvá 8 sekund, ale to může omezovat zpracování databáze nebo jiného zdroje mimo PHP. I když zkrátíte dobu zpracování PHP na nulu, bude to stále trvat déle než 7 sekund, než budete hledat.
- Ještě méně omezení se hodí pro paralelní zpracování. Předpokládejme, že konkrétní stránka vypočítává doporučenou cenu pro kótované kmenové akcie a výpočty jsou dostatečně složité a jejich dokončení zabere mnoho sekund. Výpočet může být sekvenční povahy. Neexistuje žádný zřejmý způsob, jak to distribuovat pro „spolupráci“.
- Málo PHP programátorů chápe potenciál PHP pro paralelní zpracování. Když se mluvilo o možnosti paralelizace, většina programátorů, které jsem potkal, jednoduše citovala frázi „PHP nefunguje s vlákny“ a vrátila se ke svému zavedenému výpočetnímu modelu.
Někdy to můžete udělat lépe. Předpokládejme, že stránka PHP potřebuje vypočítat dvě ceny akcií, možná je porovnat, a použitý hostitelský počítač je víceprocesorový. V tomto případě můžeme téměř zdvojnásobit výkon přiřazením dvou samostatných, dlouhotrvajících výpočtů různým procesorům.
Ve světě PHP jsou takové příklady vzácné. Protože jsem však nikde jinde nenašel přesný popis, chci zde uvést příklad takového zrychlení.
pole ("roura", "r"), 1 => pole ("roura", "w"), 2 => pole ("soubor", $ error_log, "w")); $ cmd = "spánek". $ zpoždění. "; echo" Dokončeno se zpožděním ". $ zpoždění." "."; $ handles [$ id] = proc_open ($ cmd, $ descriptorspec, $ pipes); $ streamy [$ id] = $ potrubí; $ all_pipes [$ id] = $ potrubí; $ zpoždění - = 2; ) while (count ($ streamy)) ($ read = $ streams; stream_select ($ read, $ w = null, $ e = null, $ timeout); foreach ($ čteno jako $ r) ($ id = array_search ($ r, $ streamy); echo stream_get_contents ($ all_pipes [$ id]); if (feof ($ r)) (fclose ($ all_pipes [$ id]); fclose ($ all_pipes [$ id]); $ return_value = proc_close ($ zpracovává [$ id]); nenastaveno ($ streamy [$ id]);)))?> |
Tento program zobrazí následující informace:
Program začíná v 10:28:41. Dokončeno se zpožděním 1. Dokončeno se zpožděním 3. |
Myšlenka je taková, že PHP spustilo dva nezávislé podprocesy, přijalo data z prvního a poté z druhého, ačkoli ten druhý začal dříve. Pokud je hostitelský počítač víceprocesorový a operační systém je správně nakonfigurován, postará se o přiřazení různých podprogramů různým procesorům. Toto je jeden ze způsobů, jak využít výhody víceprocesorových strojů PHP.
souhrn
PHP podporuje multitasking. PHP nepodporuje zpracování streamů tak, jak to dělají jiné programovací jazyky, jako je Java nebo C++, ale výše uvedené příklady ukázaly, že PHP má vyšší potenciál pro zrychlení, než si většina lidí uvědomuje.
Takže přátelé, pokud jste dosáhli této lekce, tak se vám podařilo buď nainstalovat lokální server, nebo koupit hosting, na kterém můžete pracovat s PHP. Gratulujeme – je to velký krok!
Krátce řeknu o PHP – tento programovací jazyk se používá po celém světě a dají se na něm vytvářet stránky všech úrovní složitosti, od vizitkových stránek až po velké portály. Myslím, že už pro mnohé není tajemstvím, že největší sociální sítě facebook.com(od nuly po php) a vk.com(php engine) byly napsány v PHP. Takže vyvodíme závěry a začneme pracovat!)
Jak kód funguje
PHP kód zpracovávány na straně serveru... To znamená, že neexistuje žádná připravená stránka. V kódu je například uveden příkaz ke shromažďování údajů o tom, kolik uživatelů je aktuálně na webu registrováno. Návštěvník webu klikne na odkaz Všichni uživatelé... Chce dostat dynamická data, tedy ty, které se neustále mění. Po dokončení počítání na serveru přijdou data ze serveru ve formě vygenerovaného HTML kódu stránky s počtem uživatelů. V důsledku toho uživatel po kliknutí na požadavek na odkaz obdrží stránku. Pokud si prohlédnete kód výsledné stránky, uvidíte pouze HTML a PHP kód nebude k dispozici pro zobrazení. Zhruba řečeno, PHP je instrukce pro server, jak a z jakých bloků vytvořit stránku.Jak vypadá PHP kód a kam jej vložit?
PHP kód lze vložit přímo do HTML. PHP kód je vložen do HTML stránek pomocí lomených závorek a otazníku , můžete se však omezit na závorky s otazníky код; ?> ... Budete muset změnit pouze příponu souboru, například z .html na .phpPHP kód(soubor index.php)
echo "Ahoj světe!";
?>