Počítače Okna Internet

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 .php

PHP kód(soubor index.php)



Příklad použití PHP


echo "Ahoj světe!";
?>



Demonstrace Stáhněte si zdroje
Výsledkem kódu bude výstup prostého textu Ahoj světe!... Zeptejte se, proč psát php kód pro zobrazení prostého textu? Echo prohlášení, o kterém si povíme trochu později, je potřeba nejen pro zobrazování textu. Častěji se echo používá k zobrazení výsledku práce nějaké funkce, která vypočítala nebo vzala data z databáze (Co je databáze?). Tedy pro dynamické zobrazení dat.

Příkaz echo v PHP

Jak jste již pochopili, operátor echo potřebné pro výstup dat. Přebíráme obsah (v našem případě zatím pouze text). citáty, a na konec dáme středník ; tím končí práce operátora.

V programování je při vytváření první stránky zvykem používat frázi Ahoj světe!- to je Ahoj světe! To je to, co používáme. V příkladu nepoužijeme html, protože to není nutné.

PHP kód

echo "Ahoj světe!";
?>
Program vypíše Ahoj světe!.
Hned v prvním příkladu jsme do html vložili malý php kód. Nyní naopak do php kódu vložíme html prvky.

PHP kód

echo" ";
echo" ";
echo" Můj první PHP skript";
echo"";
echo" ";
echo"

Ahoj světe!

";
echo "";
?>
V důsledku toho získáme prázdnou stránku s názvem Ahoj světe!

Tiskový výpis PHP

Na rozdíl od příkazu echo, tisk výstupní data včetně mezer a dělení slov. Má určitá omezení - můžete použít pouze jeden argument, echo několik. Vydrží déle než echo. V následujícím budeme tento operátor používat při psaní funkcí.

tisknout „Ahoj světe!
Druhý řádek textu "; // výsledek se zobrazí na dvou řádcích
?>
Text se zobrazí tak, jak je napsán.

Výstupní příkaz - syntaxe PHP heredoc

Jak jste si již všimli, zobrazování stránky neustálým používáním operátoru echo je ošklivé a nečitelné. Proto pro výstup velkých částí html kódu existuje další výstupní příkaz používající syntaxi heredoc. Také zobrazuje data ve stejné podobě, v jaké byla (mezery a pomlčky).

echo<<

Příklad


Příklad výstupu velkého množství textu pomocí html


Druhý odstavec téhož objemného textu.


TADY;
?>

Memorandum o lekci

PHP kód může:

1. neobsahují žádný html prvek. Stránka a text budou stále zobrazeny. html je potřeba pro pěkné označení obsahu.

2. být zahrnuty v html kódu a obsahovat jej ve svých vlastních výstupních příkazech (echo, tisk atd.). Hlavní je nezapomenout na design

3. stránky s php-kódem musí mít příslušnou příponu: .php .phtml

Od dalších lekcí probereme základy tvorby stránek v php, ve kterých uvidíte všechny výhody používání tohoto jazyka!

Děkuji za pozornost!

Hezký den všem. Toto je první článek ze série PHP pro začátečníky. Půjde o neobvyklou sérii článků, nebude tam echo "Hello World", bude tu hardcore ze života PHP programátorů s trochou "domácího úkolu" upevnit látku.

Začnu sezeními – to je jedna z nejdůležitějších součástí, se kterou budete muset pracovat. Nepochopení principů jeho práce - twist podnikání. Abychom se vyhnuli problémům, pokusím se vám říci o všech možných nuancích.

Ale nejprve, abychom pochopili, proč potřebujeme relaci, pojďme se obrátit na původ - na protokol HTTP.

Protokol HTTP

Protokol HTTP je HyperText Transfer Protocol - tzn. ve skutečnosti je to textový protokol a nebude těžké mu porozumět.

Zpočátku se předpokládalo, že tímto protokolem bude přenášen pouze HTML z místa a jména, ale nyní to, co neposílají (_ ㅅ _) = ^. ^ =

Abychom se nemlátili, uvedu příklad komunikace přes protokol HTTP, zde je požadavek, jak jej váš prohlížeč odešle, když požadujete stránku http://example.com:

GET / HTTP / 1.1 Host: example.com Přijmout: text / html ... prázdný řetězec ...

A zde je příklad odpovědi:

HTTP / 1.1 200 OK Délka obsahu: 1983 Typ obsahu: text / html; znaková sada = utf-8 ... ...

Toto jsou velmi zjednodušené příklady, ale zde můžete vidět, z čeho se skládá požadavek a odpověď HTTP:

  1. startovní čára- pro požadavek obsahuje metodu a cestu požadované stránky, pro odpověď - verzi protokolu a kód odpovědi
  2. titulky- mít formát klíč–hodnota oddělený dvojtečkou, každé nové záhlaví se píše na nový řádek
  3. tělo zprávy- HTML přímo nebo data jsou od hlaviček oddělena dvěma zalomeními řádků, mohou chybět, jako v daném požadavku

Zdá se tedy, že přišli na protokol - je jednoduchý, vede svou historií od roku 1992, takže ho nelze označit za ideální, ale co to je - odeslaná žádost - získejte odpověď, a je to, server a klient již není žádným způsobem připojen. Takový scénář ale není zdaleka jediný možný, autorizaci mít můžeme, server musí nějak pochopit, že tento požadavek přišel od konkrétního uživatele, tzn. klient a server musí komunikovat v rámci určité relace. A ano, přišli s následujícím mechanismem:

  1. při autorizaci uživatele server vygeneruje a zapamatuje si jedinečný klíč – identifikátor relace a informuje prohlížeč
  2. prohlížeč tento klíč uloží a s každým dalším požadavkem jej odešle

Pro implementaci tohoto mechanismu byly vytvořeny (cookies, cookies) - jednoduché textové soubory na vašem počítači, jeden soubor pro každou doménu (ačkoli některé prohlížeče jsou pokročilejší a používají pro ukládání databázi SQLite), přičemž prohlížeč ukládá limit na počet záznamů a velikost uložených dat (pro většinu prohlížečů je to 4096 bajtů, viz RFC 2109 z roku 1997)

Tito. pokud ukradnete cookie z vašeho prohlížeče, bude možné přejít na vaši facebookovou stránku vaším jménem? Nelekejte se, to nelze udělat, alespoň s facebookem, a pak vás naučím, jak se můžete chránit před tímto typem útoku na vaše uživatele.

Podívejme se nyní, jak se změní naše žádost-odpověď, zda existuje autorizace:

POST / přihlášení / HTTP / 1.1 Hostitel: example.com Přijmout: textové / html přihlášení = Uživatelské jméno a heslo = Uživatelské heslo

Naše metoda se změnila na POST a v těle požadavku se přenáší uživatelské jméno a heslo (pokud použijete metodu GET, řetězec požadavku bude obsahovat uživatelské jméno a heslo a může být uložen na některých zprostředkujících proxy serverech, které je velmi špatný).

HTTP / 1.1 200 OK Content-Type: text / html; charset = utf-8 Set-Cookie: KEY = VerySecretUniqueKey ... ...

Odpověď serveru bude obsahovat hlavičku Set-Cookie: KEY = VerySecretUniqueKey, která přinutí prohlížeč uložit tato data do souborů cookie a při příštím přístupu k serveru je server odešle a rozpozná:

GET / HTTP / 1.1 Host: example.com Přijmout: text / html Cookie: KEY = VerySecretUniqueKey ... prázdný řetězec ...

Jak můžete vidět, záhlaví odesílaná prohlížečem (záhlaví požadavků) a serverem (záhlaví odpovědí) se liší, ačkoli existují společné záhlaví pro požadavky i odpovědi (obecné záhlaví).

Server poznal našeho uživatele podle zaslaných cookies a dále mu poskytne přístup k osobním údajům. Takže, tak nějak vyřešeno s relacemi a HTTP, teď se můžete vrátit k PHP a jeho funkcím.

PHP a relace

Doufám, že již máte na svém počítači nainstalované PHP dále uvedu příklady a bude třeba je spustit

PHP bylo vytvořeno tak, aby odpovídalo protokolu HTTP - tzn. jeho hlavním úkolem je reagovat na požadavek HTTP a „umřít“ a uvolnit tak paměť a zdroje. Mechanismus relace tedy v PHP nefunguje v automatickém režimu, ale v manuálním režimu a musíte vědět, co volat a v jakém pořadí.

Nejprve musíte "spustit" relaci - k tomu použijeme funkci session_start (), vytvořte soubor session.start.php s následujícím obsahem:

Session_start ();

A teď - aktualizujeme stránku a vidíme, že prohlížeč odesílá tento soubor cookie na server, můžete zkusit stránku několikrát obnovit, výsledek bude stejný:

Celkem máme – teorie se shodovala s praxí a to je jen dobře.

Dalším krokem je uložení libovolné hodnoty do relace, k tomu PHP používá superglobální proměnnou $ _SESSION, aktuální čas uložíme voláním funkce date ():

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

Aktualizujeme stránku a uvidíme čas serveru, aktualizujeme jej znovu - a čas byl aktualizován. Udělejme to tak, aby se nastavený čas neměnil při každém obnovení stránky:

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

Aktualizujeme - čas se nemění, co je potřeba. Ale zároveň si pamatujeme, že PHP umírá, což znamená, že tuto relaci někde uloží a my najdeme toto místo ...

Všechno tajemství je jasné

PHP standardně ukládá relaci do souborů – za to je zodpovědná direktiva session.save_handler, cestu, kam se soubory ukládají, hledejte v direktivě session.save_path nebo použijte funkci session_save_path () pro získání požadované cesty.

Ve vaší konfiguraci nemusí být uvedena cesta k souborům, pak budou soubory relace uloženy v dočasných souborech ve vašem systému – zavolejte funkci sys_get_temp_dir () a zjistěte, kde se toto skryté místo nachází.

Jdeme tedy touto cestou a najdeme váš soubor relace (mám tento soubor sess_dap83arr6r3b56e0q7t5i0qf91), otevřete jej v textovém editoru:

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

Jak vidíte, toto je náš čas, toto je složitý formát, ve kterém je naše relace uložena, ale můžeme provádět úpravy, měnit čas nebo můžeme jednoduše zadat libovolný řádek, proč ne:

Čas | s: 13: "\ m / (@ [e-mail chráněný]) \ m / ";

Chcete-li převést tento řetězec na pole, musíte použít funkci session_decode () pro zpětnou konverzi - session_encode () - nazývá se to serializace, ale pouze v PHP pro relace - je speciální, i když můžete použít standardní serializaci PHP - napište to do konfigurační direktivy session .serialize_handler php_serialize value a budete spokojeni a $ _SESSION lze používat bez omezení - nyní můžete jako index používat čísla a speciální znaky | a! ve jménu (za všech 10+ let práce jsem nikdy nemusel :)

Cvičení
Napište svou vlastní funkci, která je podobná funkcionalitě session_decode (), zde je testovací sada dat pro relaci (k vyřešení nepotřebujete znalost regulárních výrazů), vezměte text pro převod ze souboru vaší aktuální relace:

$ _SESSION ["integer var"] = 123; $ _SESSION ["float var"] = 1,23; $ _SESSION ["osmičková var"] = 0x123; $ _SESSION ["string var"] = "Ahoj světe"; $ _SESSION ["array var"] = ["jeden", "dva",]; $ objekt = new stdClass (); $ object-> foo = "bar"; $ object-> arr = ["ahoj", "svět"]; $ _SESSION ["object var"] = $ objekt; $ _SESSION ["znovu celé číslo"] = 42;

Co jsme tedy ještě nezkusili? Je to tak – pro krádež cookies spusťte jiný prohlížeč a přidejte do něj stejné cookies. Napsal jsem vám k tomu jednoduchý javascript, zkopírujte ho do konzole prohlížeče a spusťte, jen nezapomeňte změnit identifikátor relace na svůj:

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

Nyní máte oba prohlížeče, které se dívají na stejnou relaci. Výše jsem uvedl, že budu hovořit o metodách ochrany, zvažuji nejjednodušší způsob - navážeme relaci na prohlížeč, přesněji na to, jak se prohlížeč jeví na serveru - zapamatujeme si User-Agent a pokaždé ho zkontrolujeme:

Session_start (); if (! isset ($ _ SESSION ["time"])) ($ _SESSION ["ua"] = $ _SERVER ["HTTP_USER_AGENT"]; $ _SESSION ["time"] = datum ("H: i: s") ; ) if ($ _SESSION ["ua"]! = $ _SERVER ["HTTP_USER_AGENT"]) (die ("Špatný prohlížeč");) echo $ _SESSION ["čas"];

To je těžší předstírat, ale stále je to možné, přidejte sem ukládání a kontrolu $ _SERVER ["REMOTE_ADDR"] a $ _SERVER ["HTTP_X_FORWARDED_FOR"] a bude to víceméně vypadat jako ochrana před vetřelci pronikajícími do našich "cookies".

Klíčové slovo v předchozím odstavci vypadá to, ve skutečných projektech cookies již dlouho běží přes protokol HTTPS, takže je nikdo nemůže ukrást bez fyzického přístupu k vašemu počítači nebo smartphonu

Cvičení
Přidejte do kódu kontrolu IP uživatele, pokud kontrola selže, smažte kompromitovanou relaci.

Krok za krokem

A nyní vysvětlím krok za krokem algoritmus toho, jak relace funguje v PHP, na příkladu následujícího kódu (výchozí nastavení):

Session_start (); $ _SESSION ["id"] = 42;

  1. po zavolání session_start () PHP hledá identifikátor relace v cookie podle názvu uvedeného v session.name - toto je PHPSESSID
  2. pokud neexistuje žádný identifikátor, pak se vytvoří (viz session_id ()) a vytvoří prázdný soubor relace podél cesty session.save_path s názvem sess_ (session_id ()), do odpovědi serveru se přidají hlavičky pro nastavení cookie (název_relace ()) = (id_relace ())
  3. pokud je identifikátor přítomen, pak hledáme soubor session ve složce session.save_path:
    • nenalezeno - vytvořte prázdný soubor s názvem sess _ ($ _ COOKIE) (identifikátor může obsahovat pouze znaky z rozsahů a-z, A-Z, 0-9, čárku a znaménko mínus)
    • najít, přečíst soubor a rozbalit data (viz session_decode ()) do superglobální proměnné $ _SESSION
  4. když skript dokončí svou práci, všechna data z $ _SESSION jsou zabalena pomocí session_encode () do souboru podél cesty session.save_path s názvem sess_ (session_id ())

Cvičení
Nastavte v prohlížeči libovolnou hodnotu pro cookie s názvem PHPSESSID, nechejte to být 1234567890, obnovte stránku, zkontrolujte, zda jste vytvořili nový soubor sess_1234567890

Existuje život bez sušenek?

PHP umí pracovat s relací, i když jsou v prohlížeči zakázány soubory cookie, ale pak budou všechny adresy URL na webu obsahovat parametr s identifikátorem vaší relace a ano – to je ještě potřeba nakonfigurovat, ale potřebujete to? Nemusel jsem to použít, ale pokud opravdu chci, řeknu vám, kde kopat:

A pokud potřebujete uložit relaci do databáze?

Chcete-li uložit relaci do databáze, musíte změnit úložiště relace a sdělit PHP, jak ji používat, pro tento účel bylo vytvořeno rozhraní SessionHandlerInterface a funkce session_set_save_handler.

Samostatně poznamenávám, že pro redis a memcache nemusíte psát své vlastní handlery relací – když si tato rozšíření nainstalujete, odpovídající handlery se s nimi spojí, takže RTFM je pro nás vším. No, ano, handler musí být specifikován před voláním session_start ();)

Cvičení
Implementujte SessionHandlerInterface pro uložení relace MySQL a vyzkoušejte, zda to funguje.
Toto je zadání s hvězdičkou pro ty, kteří již znají databáze.

Kdy relace zemře?

Zajímavá otázka, můžete ji položit ostříleným vývojářům – kdy PHP smaže soubory relace, jejichž platnost vypršela? Odpověď je v oficiální příručce, ale ne explicitně - takže pamatujte:

Shromažďování odpadků lze spustit při volání funkce session_start (), pravděpodobnost spuštění závisí na dvou direktivách session.gc_probability a session.gc_divisor, první funguje jako dělenec, druhá jako dělitel a ve výchozím nastavení tyto hodnoty ​jsou 1 a 100, tj. pravděpodobnost, že bude spuštěn kolektor a soubory relace budou smazány, je přibližně 1 %.

Cvičení
Změňte hodnotu direktivy session.gc_divisor tak, aby se garbage collector spustil pokaždé, zkontrolujte, že se tak stane.

Nejtriviálnější chyba

Chyba s více než půl milionem výsledků ve výsledcích vyhledávání Google:

Nelze odeslat cookie relace - záhlaví již odesláno podle
Nelze odeslat omezovač mezipaměti relace - záhlaví již odesláno

Chcete-li jej získat, vytvořte soubor session.error.php s následujícím obsahem:

Echo str_pad ("", ini_get ("output_buffering")); session_start ();

Na druhém řádku je zvláštní "kouzlo" - jedná se o trik s výstupním bufferem, o tom budu mluvit v některém z příštích článků, zatím to považujte pouze za řádek o délce 4096 znaků, v tomto případě jsou to všechny prostory

Spusťte, po smazání cookie, a dostanete výše uvedené chyby, i když text chyby je jiný, ale podstata je stejná - vlak odjel - server již odeslal obsah stránky do prohlížeče a je příliš pozdě odesílat hlavičky, nebude to fungovat a v souborech cookie se neobjevil chráněný identifikátor relace. Pokud jste narazili na tuto chybu, vyhledejte místo, kde je text zobrazen
předem, může to být mezera před znakyv jednom z přiložených souborů a dobře, pokud je to mezera, může tam být nějaký netisknutelný znak, jako je kusovník, takže buďte opatrní a tato infekce se vás nedotkne (no,… homerský smích).

Cvičení
Chcete-li otestovat tyto znalosti, chci, abyste implementovali svůj vlastní mechanismus relace a zprovoznili výše uvedený kód:

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

K tomu potřebujete funkci register_shutdown_function ().

Konečně

V tomto článku dostanete šest úkolů, které se netýkají pouze práce s relacemi, ale také vás seznámí s MySQL a funkcemi práce s řetězci. Pro zvládnutí tohoto materiálu - nepotřebujete samostatný článek, postačí manuál na uvedených odkazech - nikdo to za vás nepřečte. Jít na to!

P.S. Pokud jste se z článku dozvěděli něco nového - děkuji autorovi - sdílejte článek na sociálních sítích;)

Pokud jste v PHP nováčkem, existuje několik definic, které potřebujete znát.
Za prvé, PHP je programovací jazyk a používá se k psaní příkazů (skriptů) adresovaných serveru. Aby to bylo ještě jednodušší, pomocí PHP můžeme komunikovat se serverem.
Příkazy PHP lze snadno vložit do stránek HTML. Právě tato vlastnost je důležitou výhodou PHP oproti jazykům jako Perl a C.

syntaxe PHP

Kód PHP skriptu se spustí po otevření tagu... Text mezi těmito dvěma tagy je přečten programem na serveru a výsledek je převeden do HTML dokumentu. Vezměme si příklad:



Příklad

include ("sidebar.htm");
?>


Pokud potřebujeme něco vložit do html kódu stránky, musíme použít příkaz include. Dále uvedeme adresu souboru a řádek končí, jako v CSS;

Vložte HTML kód na stránky webu

Zpravidla postranní panely ( postranní panel) a suterén ( zápatí) zůstávají nezměněny na všech stránkách webu. Proto ty kódy

.....
a lze umístit na samostatné stránky htm "sidebar.htm" a "footer.htm" a vložit do stránek webu pomocí příkazu include. Pokud je současně hlavní obsah přenesen do samostatného souboru -
.....
, pak bude kód naší stránky vypadat takto:



Příklad

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


obsah sidebar.htm


tady
obsah
Tvůj jeho
boční lišta

Stejně tak se soubory content.htm a footer.htm.

S touto generací stránek stačí provést změny v jednom souboru „sidebar.htm“, abyste změnili všechny stránky webu. To je velmi výhodné, pokud váš web obsahuje stovky nebo tisíce stránek.

PHP na vašem počítači

Abyste mohli pracovat s PHP skripty a prohlížet si výsledky provádění v prohlížeči, musíte si na svůj lokální počítač nainstalovat funkční webový server s PHP.
Denver je pro takové úkoly nejvhodnější. (oficiální stránka poskytuje vše, co potřebujete je zdarma) Instalační sada obsahuje - Apache, php a MySQL. Jinými slovy, na vašem počítači bude umístěn plně funkční server pro hostování stránek.

Aby PHP kód fungoval na HTML stránkách, musíte soubor otevřít .htaccess v libovolném textovém editoru a napište následující:

Aplikace AddHandler / x-httpd-php .html

Tato položka umožňuje spouštění PHP skriptů na HTML stránkách.

Nebo změňte příponu souboru. html na. php

Funkce PHP

PHP umí víc než jen vykreslovat HTML. Možnosti PHP zahrnují generování obrázků, PDF a dokonce Flash filmů (pomocí libswf a Ming) generovaných za běhu. PHP je také schopné obsluhovat jakákoli textová data, jako jsou XHTML a další soubory XML. PHP je schopno automaticky generovat takové soubory a ukládat je do souborového systému vašeho serveru místo toho, aby je poskytovalo klientovi, čímž organizuje mezipaměť dynamického obsahu na straně serveru.

Jednou z významných výhod PHP je jeho podpora pro širokou škálu databází. Zkrátka PHP vám má co nabídnout! Více podrobností o výhodách PHP lze nalézt na www.php.su.

1. února 2015


Když začínáte psát programy pro web, mnoho začínajících programátorů narazí na tuto chybu. Dívají se na systém prohlížeč-server jako na normální aplikaci. Interaktivní. Stiskl jsem tlačítko - systém zareagoval. Nakreslil jsem to myší - reagovalo to. Všechny informace, které má klient k dispozici, má k dispozici i program, program je neustále v paměti.
Tedy v programování webu to není pravda!.
V okamžiku, kdy uživatel uvidí stránku před sebou a začne s ní provádět nějaké akce, PHP již skončilo! A uživatel nekomunikuje s PHP skriptem, ale se svou HTML stránkou, kterou obdržel v prohlížeči. Ve většině případů je výsledkem PHP skriptu prostý text. Text stránky HTML. Což je předáno prohlížeči a zobrazeno jako normální HTML. Přesvědčit se o tom můžete sami, když si zapíšete do scénáře
"Ahoj, Vasya!" ; ?> ;
A následně zobrazením zdrojového textu výsledné stránky v prohlížeči. Nejsou tam žádné PHP tagy! Pouze
Ahoj, Vasya!
Protože PHP se spouští na serveru!

Server a prohlížeč komunikují vzájemným zasíláním požadavků pomocí speciálního protokolu - HTTP. Spojení může zahájit pouze prohlížeč. Odešle serveru požadavek na zobrazení takového a takového souboru. Server odešle soubor klientovi.
To je jediný způsob, jak se to stane. Klient požadoval - server to dal pryč. A hned zapomněl na klienta. Odtud je jasná odpověď na otázku, zda je možné přesně vědět, kolik uživatelů je nyní na webu. Je zakázáno. protože "na stránkách" není ani jeden. Připojí se, vyžádají si stránku a odpojí se. Nemějte trvalé připojení k serveru, jako například hráči Kwaku. To zjistíte pouze přibližně záznamem času každého spojení a výběrem záznamů za určité časové období.

Příklad komunikace mezi prohlížečem a serverem:
Uživatel klikne na odkaz, prohlížeč odešle požadavek na server a čeká na odpověď:
Prohlížeč -> PHP
PHP spustí skript, odešle výsledek do prohlížeče a ukončí:
PHP -> prohlížeč
Prohlížeč zobrazí stránku a „prohledá“ na ní odkazy, které je třeba vyžádat ze serveru (tagy ,