Matrice superglobală $_SERVER. Matrice globală $_SERVER în serverul PHP Sinless php

Matrice superglobală $_SERVER

Una dintre cele mai importante matrice predefinite este matricea $_SERVER - interpretul PHP plasează variabilele primite de la server în el. Fără aceste variabile, este dificil să se organizeze suport complet pentru aplicațiile Web. Mai jos este o descriere a celor mai importante elemente ale matricei superglobale $_SERVER.

Comentariu

Puteți vizualiza lista completă a elementelor matricei $_SERVER fie folosind funcția print_r(), care imprimă un dump a matricei, fie folosind funcția phpinfo(), care afișează informații despre interpretul PHP.

Element $_SERVER[„DOCUMENT_ROOT”]

Elementul $_SERVER["DOCUMENT_ROOT"] conține calea către directorul rădăcină a serverului, dacă scriptul este executat într-o gazdă virtuală, acest element specifică calea către directorul rădăcină a gazdei virtuale. Aceste. în fișierul de configurare httpd.conf, gazda virtuală are o directivă DocumentRoot setată la „D:/main”, elementul $_SERVER[“DOCUMENT_ROOT”] va conține valoarea „D:main”.

element $_SERVER[„HTTP_ACCEPT”].

Elementul $_SERVER["HTTP_ACCEPT"] descrie preferințele clientului pentru tipul de document. Conținutul acestui element este preluat din antetul Accept HTTP trimis de client către server. Conținutul acestui antet ar putea arăta astfel:

imagine/gif, imagine/x-xbitmap, imagine/jpeg, imagine/pjpeg, aplicație/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*

Antetul Accept vă permite să specificați tipul media pe care clientul preferă să îl primească ca răspuns la cererea sa. Acest antet informează serverul că răspunsul este limitat la un set mic de tipuri preferate.

Simbolul * este folosit pentru a grupa tipurile într-un rând media. De exemplu, simbolul */* specifică utilizarea tuturor tipurilor, iar tipul de notație/* specifică utilizarea tuturor subtipurilor tipului de tip selectat.

Comentariu

Tipurile media sunt separate prin virgule.

Fiecare serie media este, de asemenea, caracterizată de un set suplimentar de parametri. Unul dintre ele este așa-numitul coeficient de preferință relativă q, care ia valori de la 0 la 1, respectiv, de la tipurile mai puțin preferate la cele mai preferate.

Comentariu

Utilizarea mai multor parametri q permite clientului să spună serverului preferința sa relativă pentru un anumit tip de media.

În mod implicit, parametrul q este 1. De asemenea, este separat de tipul media printr-un punct și virgulă.

Exemplu de antet Accept:

Accept: audio/*; q=0,2, audio/de bază

În acest antet, primul tip este audio/*, care include toate documentele muzicale și se caracterizează printr-un coeficient de preferință de 0,2. Separat prin virgule, este indicat tipul audio/de baza, pentru care nu este specificat coeficientul de preferinta si ia o valoare implicita de unu. Citând RFC2616, acest titlu poate fi interpretat astfel: „Prefer tipul audio/de bază, dar pot trimite și documente de orice alt tip audio, dacă sunt disponibile, după reducerea factorului de preferință cu mai mult de 80%”.

Exemplul poate fi mai complex.
Accept: text/plan simplu; q=0,5, text/html,

Comentariu

text/x-dvi;

q=0,8, text/x-c

Rețineți că elementul $_SERVER["HTTP_ACCEPT"] conține exact aceleași informații, dar fără antetul inițial Accept.

Acest antet este interpretat după cum urmează: Sunt preferate tipurile de document text/html și text/x-c, dar dacă acestea nu sunt disponibile, atunci clientul care face această solicitare va prefera text/x-dvi și, dacă acesta nu este disponibil, acesta poate accepta tipul text/ simplu

Element $_SERVER[„HTTP_ACCEPT_LANGUAGE”]

Elementul $_SERVER["HTTP_ACCEPT_LANGUAGE"] descrie preferințele de limbă ale clientului. Aceste informații sunt extrase din antetul HTTP Accept-Language pe care clientul îl trimite către server. Se poate da următorul exemplu:

Accept-Language: ru, en;

Conținutul elementului $_SERVER["HTTP_ACCEPT_LANGUAGE"] poate fi folosit pentru a determina naționalitatea vizitatorilor. Cu toate acestea, rezultatele vor fi aproximative, deoarece mulți utilizatori folosesc versiuni în limba engleză ale browserelor, care vor anunța serverul că vizitatorul preferă o singură limbă - engleza.

Element $_SERVER[„HTTP_HOST”]

Elementul $_SERVER["HTTP_HOST"] conține numele serverului, care de obicei se potrivește cu numele de domeniu al site-ului situat pe server. De obicei, numele specificat în acest parametru este același cu numele $_SERVER[„SERVER_NAME”]. Parametrul conține doar numele domeniului fără numele protocolului (http://), adică.

www.sofftime.ru

Element $_SERVER[„HTTP_REFERER”]

Elementul $_SERVER["HTTP_REFERER"] conține adresa paginii de la care vizitatorul a ajuns la această pagină. Tranziția trebuie efectuată printr-un link. Să creăm două pagini index.php și page.php.

pagina index.php

ecou "Link către pagina PHP
"
;
ecou .
$_SERVER[„HTTP_REFERER”]
?>

Pagina page.php va avea un conținut similar, dar linkul va indica pagina index.php.

Pagina page.php

ecou "Link către pagina PHP
"
;
ecou "Conținutul lui $_SERVER["HTTP_REFERER"] - ".
$_SERVER[„HTTP_REFERER”]
?>

La trecerea de la o pagină la alta, sub link va fi afișată adresa paginii de la care s-a făcut tranziția.

Element $_SERVER[„HTTP_USER_AGENT”]

Elementul $_SERVER["HTTP_USER_AGENT"] conține informații despre tipul și versiunea browserului și a sistemului de operare al vizitatorului.

Iată un conținut tipic al acestei linii: „Mozilla/4.0 (compatibil; MSIE 6.0; Windows NT 5.1)”. Prezența subșirului „MSIE 6.0” indică faptul că vizitatorul vizualizează pagina folosind Internet Explorer versiunea 6.0. Linia „Windows NT 5.1” indică faptul că sistemul de operare este Windows XP.

Comentariu

Pentru Windows 2000, elementul $_SERVER["HTTP_USER_AGENT"] arată astfel: "Mozilla/4.0 (compatibil; MSIE 5.01; Windows NT 5.0)"), în timp ce pentru Windows XP arată ca "Mozilla/4.0 (compatibil; MSIE 6.0) ;Windows NT 5.1)".

Dacă vizitatorul folosește browserul Opera, conținutul $_SERVER["HTTP_USER_AGENT"] ar putea arăta astfel: "Mozilla/4.0 (compatibil; MSIE 5.0; Windows 98) Opera 6.04".

Comentariu

Aici este prezent și subșirul „MSIE 6.0”, indicând faptul că browserul Opera este compatibil cu browserul Internet Explorer și folosește aceleași biblioteci dinamice Windows. Prin urmare, atunci când analizați șirul returnat de browser, trebuie să aveți în vedere că Internet Explorer se referă la un șir care conține subșirul „MSIE 6.0” și care nu conține subșirul „Opera”. În plus, din această linie putem concluziona că utilizatorul folosește sistemul de operare Windows 98.

Agentul utilizator al browserului Firefox ar putea arăta astfel: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5.

Când utilizați browserul Netscape, conținutul elementului $_SERVER["HTTP_USER_AGENT"] ar putea arăta astfel: "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1" . Apartenența acestui browser poate fi determinată de prezența subșirului „Netscape”. În plus, puteți afla că vizitatorul accesează Internetul folosind o versiune de operare a Linux, cu un kernel optimizat pentru Pentium IV, în timp ce se află în shell-ul grafic X-Window. Acest mecanism este convenabil de utilizat pentru a colecta informații statistice, ceea ce le permite designerilor să optimizeze paginile pentru cele mai comune browsere.

Element $_SERVER[„REMOTE_ADDR”]

Comentariu

Elementul $_SERVER["REMOTE_ADDR"] conține adresa IP a clientului. Când testați pe o mașină locală, această adresă va fi egală cu 127.0.0.1. Totuși, la testarea în rețea, variabila va returna adresa IP a clientului sau ultimul server proxy prin care clientul a ajuns la server. Dacă clientul folosește un server proxy, puteți afla adresa IP a acestuia folosind variabila de mediu HTTP_X_FORWARDED_FOR, a cărei valoare poate fi obținută folosind funcția getenv().

Serverele proxy sunt servere intermediare speciale care oferă un tip special de serviciu: comprimarea traficului, codificarea datelor, adaptarea pentru dispozitive mobile etc. Printre numeroasele servere proxy, există așa-numitele servere proxy anonime, care vă permit să ascundeți adresa IP adevărată a clientului, astfel de servere nu returnează variabila de mediu HTTP_X_FORWARDED_FOR.

Se preia variabila de mediu HTTP_X_FORWARDED_FOR
?>

echo getenv(HTTP_X_FORWARDED_FOR);

Elementul $_SERVER["SCRIPT_FILENAME"] conține calea absolută către fișier de la rădăcina discului. Deci, dacă serverul rulează sistemul de operare Windows, atunci această cale poate arăta astfel: „d:main estindex.php”, adică. calea este specificată de pe disc într-un sistem de operare asemănător UNIX, calea este specificată din directorul rădăcină /, de exemplu „/var/share/www/test/index.php”.

Element $_SERVER[„SERVER_NAME”]

Elementul $_SERVER[„SERVER_NAME”] conține numele serverului, care de obicei se potrivește cu numele de domeniu al site-ului aflat pe acesta.

De exemplu,

www.softtime.ru

Conținutul elementului $_SERVER["SERVER_NAME"] este adesea același cu conținutul elementului $_SERVER["HTTP_HOST"]. Pe lângă numele serverului, matricea superglobală $_SERVER vă permite să aflați o serie de parametri ai serverului, de exemplu, adresa IP a serverului, portul de ascultare, ce server Web este instalat și versiunea protocolului HTTP. Aceste informații sunt plasate în elementele $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"] și, respectiv, $_SERVER["SERVER_PROTOCOL".

Mai jos este un exemplu de utilizare a acestor elemente.
" ;
ecou Utilizarea elementelor de matrice $_SERVER echo "Nume server - " . $_SERVER[„SERVER_NAME”]. "
" ;
„Adresa IP a serverului – „
" ;
. $_SERVER[„SERVER_ADDR”]. "
" ;
ecou echo "Port server - " . $_SERVER[„SERVER_PORT”]. " echo "Server web - " . $_SERVER[„SOFTWARE_SERVER”]. "
" ;
?>

"Versiunea protocolului HTTP - "

. $_SERVER[„PROTOCOL_SERVER”]. "

Element $_SERVER[„REQUEST_METHOD”]

Elementul $_SERVER["REQUEST_METHOD"] conține metoda de solicitare care este folosită pentru a apela scriptul: GET sau POST.

$HTTP_SERVER_VARS [șters] (PHP 4 >= 4.1.0, PHP 5, PHP 7)$_SERVER --

$HTTP_SERVER_VARS [șters]

Informații despre server și mediul de execuție

Variabila $HTTP_SERVER_VARS conține aceleași informații inițiale, dar nu este superglobală.

(Rețineți că $HTTP_SERVER_VARS și $_SERVER sunt variabile diferite, așa că PHP le tratează în consecință).

De asemenea, rețineți că „matricele lungi” au fost eliminate în PHP 5.4.0, deci $HTTP_SERVER_VARS nu mai există.

Indici Puteți găsi (sau nu) oricare dintre următoarele elemente în matricea $_SERVER. Rețineți că puține, dacă există, articole vor fi disponibile (sau vor face cu adevărat diferența) dacă PHP rulează pe linia de comandă. „PHP_SELF” Numele fișierului script care rulează în prezent, relativ la rădăcina documentului. De exemplu, $_SERVER["PHP_SELF"] în scriptul de la http://example.com/foo/bar.php ar fi /foo/bar.php . Constanta __FILE__ conține calea completă și numele fișierului curent (adică, conectat). Dacă PHP rulează pe linia de comandă, această variabilă conține numele scriptului, începând cu PHP 4.3.0. Anterior nu era disponibil. "argv" O serie de argumente transmise scriptului. Când scriptul este rulat pe linia de comandă, oferă acces asemănător C la opțiunile din linia de comandă. Când este apelată prin metoda GET, această matrice va conține șirul de interogare. "argc" Conține numărul de parametri trecuți scriptului (dacă este lansat pe linia de comandă).". „GATEWAY_INTERFACE” Conține versiunea specificației CGI utilizată de server; de exemplu" CGI/1.1„SERVER_ADDR” Adresa IP a serverului pe care rulează scriptul curent.„SERVER_NAME” Numele gazdei pe care rulează scriptul curent. Dacă scriptul rulează pe o gazdă virtuală, acesta va conține numele definit pentru gazda virtuală respectivă."; „SERVER_SOFTWARE” Șirul de identificare a serverului specificat în anteturi atunci când apare un răspuns la o solicitare. „SERVER_PROTOCOL”", "Numele și versiunea protocolului de informații prin care a fost solicitată pagina; de exemplu "", "HTTP/1.0", "„REQUEST_METHOD”".

Ce metodă a fost folosită pentru a solicita pagina; de exemplu ":

OBŢINE Numele și versiunea protocolului de informații prin care a fost solicitată pagina; de exemplu ".

CAP POST PUNE Comentariu Scriptul PHP se iese după trimiterea antetelor (adică după efectuarea oricărei ieșiri fără a pune în tampon ieșirea), dacă cererea a fost făcută folosind metoda „REQUEST_TIME” Marca temporală a începerii cererii. Disponibil începând cu PHP 5.1.0. Directorul rădăcină al documentului în care este executat scriptul curent este exact cel specificat în fișierul de configurare a serverului.„HTTP_ACCEPT” Conținutul antetului Accepta: din cererea curentă, dacă există." HTTP_ACCEPT_CHARSET " Conținutul antetului Accept-Charset: din cererea curentă, dacă există. De exemplu: " izo-8859-1,*,utf-8". " HTTP_ACCEPT_ENCODING " Conținutul antetului Acceptare-codare: gzip". " HTTP_ACCEPT_LANGUAGE " Conținutul antetului Limba de acceptare: din cererea curentă, dacă există. De exemplu: " ro". „HTTP_CONNECTION” Conținutul antetului Conexiune: din cererea curentă, dacă există. De exemplu: " Păstrează-Viață". „HTTP_HOST” Conținutul antetului Gazdă: din cererea curentă, dacă există.„HTTP_REFERER” Adresa paginii (dacă există) care a adus browserul utilizatorului la această pagină. Acest antet este setat de browserul web al utilizatorului. Conținutul antetului Nu toate browserele îl instalează, iar unele vă permit să modificați conținutul antetului HTTP_REFERER ca o caracteristică suplimentară. Într-un cuvânt, chiar nu se poate avea încredere în el." HTTP_USER_AGENT " User-Agent: din cererea curentă, dacă există. Această linie conține browserul pe care utilizatorul l-a folosit pentru a solicita această pagină. Un exemplu tipic este linia: Mozilla/4.5 (X11; U; Linux 2.2.9 i586). Printre altele, puteți utiliza această valoare cu funcția get_browser() pentru a adapta rezultatul paginii dvs. la capacitățile browserului utilizatorului

Ce metodă a fost folosită pentru a solicita pagina; de exemplu ": „HTTPS” Acceptă o valoare nevidă dacă solicitarea a fost făcută prin protocolul HTTPS. Rețineți că atunci când utilizați ISAPI cu IIS, valoarea va fi

oprit , dacă solicitarea nu a fost făcută prin HTTPS.„REMOTE_ADDR” Adresa IP de la care utilizatorul vizualizează pagina curentă.

Ce metodă a fost folosită pentru a solicita pagina; de exemplu ": „REMOTE_HOST” Gazda la distanță de la care utilizatorul vizualizează pagina curentă. Căutarea inversă DNS se bazează pe valoarea variabilei REMOTE_ADDR. Serverul dvs. web trebuie să fie configurat pentru a crea această variabilă. De exemplu, în Apache aveți nevoie de prezența directivei.

Căutare nume de gazdă activată în fișierul httpd.conf astfel încât această variabilă să fie creată. Vezi de asemenea gethostbyaddr() „REMOTE_PORT” Portul de pe mașina de la distanță care este utilizat pentru a comunica cu serverul web. „REMOTE_USER” Utilizator autentificat.

„REDIRECT_REMOTE_USER”

Ce metodă a fost folosită pentru a solicita pagina; de exemplu ":

Dacă scriptul este rulat pe linia de comandă (CLI) folosind o cale relativă, cum ar fi file.php sau ../file.php , variabila $_SERVER["SCRIPT_FILENAME"] va conține calea relativă specificată de utilizator.

„SERVER_ADMIN” Această variabilă își obține valoarea (pentru Apache) dintr-o directivă din fișierul de configurare a serverului. Dacă scriptul rulează pe o gazdă virtuală, aceasta va fi valoarea definită pentru gazda virtuală respectivă.„SERVER_PORT” Portul de pe computerul server pe care îl folosește serverul web pentru a se conecta. 80 Pentru setările implicite, valoarea va fi "

Ce metodă a fost folosită pentru a solicita pagina; de exemplu ": "; folosind SLL, de exemplu, această valoare va fi cea configurată pentru conexiuni HTTP securizate. Pentru a obține un port fizic (real) în Apache 2, trebuie să instalați UseCanonicalName = Activat Şi UseCanonicalPhysicalPort = Activat

, în caz contrar, această valoare poate fi înlocuită și nu poate returna valoarea reală a portului fizic. Bazarea pe această valoare este nesigură în contextul aplicațiilor care necesită securitate sporită.„SERVER_SIGNATURE” Un șir care conține versiunea serverului și numele gazdei virtuale care este adăugat la paginile generate de server, dacă este activat.

Ce metodă a fost folosită pentru a solicita pagina; de exemplu ": „PATH_TRANSLATED” Calea bazată pe sistemul de fișiere (nu pe rădăcina documentului) către scriptul curent, după ce serverul a făcut orice mapare virtual-real. Începând cu PHP 4.3.2, variabila PATH_TRANSLATED nu mai este setată implicit în Apache 2 SAPI, în comparație cu Apache versiunea 1, unde a fost setată la aceeași valoare ca variabila SCRIPT_FILENAME atunci când nu este utilizată de Apache. Această modificare a fost făcută pentru a se conforma cu specificația CGI, unde variabila PATH_TRANSLATED ar trebui să existe numai când este definită PATH_INFO.

Utilizatorii Apache 2 pot folosi directiva AcceptPathInfo = Activatîn fișierul de configurare httpd.conf pentru a seta variabila PATH_INFO. „SCRIPT_NAME” Conține calea către scriptul care se execută în prezent. Acest lucru este util pentru paginile care trebuie să indice către ele însele.". Constanta __FILE__ conține calea completă și numele fișierului curent (adică inclus). „REQUEST_URI” URI-ul care a fost transmis pentru a accesa această pagină. Când se realizează autentificarea HTTP, această variabilă este setată la numele de utilizator furnizat de utilizator.„PHP_AUTH_PW” Când se realizează autentificarea HTTP, această variabilă este setată la parola furnizată de utilizator.„AUTH_TYPE” Când se realizează autentificarea HTTP, această variabilă este setată la tipul de autentificare care este utilizat.„PATH_INFO” Conține orice cale furnizată de utilizator după numele scriptului, dar înaintea șirului de interogare, dacă este disponibil. De exemplu, dacă scriptul curent este solicitat de adresa URL http://www.example.com/php/path_info.php/some/stuff?foo=bar , atunci variabila $_SERVER["PATH_INFO"] va conține?>

/unele/lucruri

  • Rezultatul rulării acestui exemplu va fi ceva de genul acesta.
  • Traducere

Tutorial
Una dintre cele mai tari inovații din PHP 5.4 este serverul încorporat, creat special pentru dezvoltare și testare. Acum vă puteți scrie și testa codul fără a avea un server web complet - doar porniți serverul încorporat, testați codul și opriți-l când ați terminat.

Serverul oferă, de asemenea, posibilitatea de utilizare creativă. De exemplu, puteți distribui o aplicație web portabilă pe CD sau USB sau chiar ca o aplicație desktop construită în PHP fără a utiliza GTK sau alte biblioteci grafice.
Manualul PHP subliniază faptul că serverul încorporat este destinat dezvoltării și este recomandat să nu-l folosești pe un server de producție. Nu există directive INI responsabile pentru server (cu excepția colorării ieșirii în consolă) și se pare că ideea principală a documentației este: „acum avem și un server Web, lăsați-ne în pace.”
În ciuda acestui fapt, cred că un server încorporat poate fi un instrument valoros pentru dezvoltare și testare. De exemplu, pe mașina mea folosesc Apache preinstalat cu o configurație personalizată care mi se potrivește, dar uneori vreau să încerc câteva aplicații Web noi. Cu un server web încorporat, pot testa aplicația direct din folderul de descărcări sau temporar și o pot muta în mediul obișnuit doar atunci când este necesar.
În acest articol, voi explica câteva utilizări de bază ale serverului încorporat și vă voi arăta cum să îl faceți util pentru dezvoltare și testare.

Folosim serverul încorporat

Deci, pentru a folosi serverul avem nevoie de php 5.4 sau mai mare. Pentru a verifica versiunea PHP, rulați:
php -v
De asemenea, puteți determina dacă serverul este disponibil în versiunea dvs. rulând:
php -h
și găsiți acolo o descriere a parametrilor „-S” și „-t”, care sunt utilizați doar pentru server.
Pentru a testa serverul, puteți crea un fișier index.php în directorul curent, care va conține un apel la funcția phpinfo() și apoi va porni serverul:
$ php -S 127.0.0.1:8080 PHP 5.4.0RC7 Development Server a început la vineri, 26 februarie 18:49:29 2012 Ascultare pe 127.0.0.1:8080 Rădăcina documentului este /home/ec2-user Apăsați Ctrl-C pentru a ieși.
Și acum puteți vedea conținutul trimis de serverul web încorporat:

Fiecare cerere client va fi scrisă pe consolă:
80.180.55.37:36318 : / 80.180.55.37:36584 : /
Revenind înapoi, să ne uităm la parametrul liniei de comandă „-S”, care este folosit pentru a specifica adresa de la care serverul va fi accesibil. Valori posibile:
localhost- serverul va fi accesibil doar de pe mașina locală,
0.0.0.0 - pe orice interfață de mașină,
Orice IP extern sau gri- numai pe IP-ul specificat
Opțiunea „-t” setează directorul specificat la „rădăcină director”. De exemplu:
$php -S :8090 -t /home/ec2-user/public
În plus,. puteți specifica numele unui anumit fișier de ruter. De exemplu:
$ php -S >localhost sau IP-ul dvs. public>:8080 -t /home/ec2-user/public public/index.php
Ieșirea acestui router va fi analizată și executată de server. Exemplu simplu:
Bun venit la PHP

";
Dacă scriptul returnează FALSE, atunci URI-ul solicitat va fi procesat de server, care fie va returna resursa solicitată, fie va returna o eroare 404. Dacă scriptul returnează altceva, rezultatul scriptului va fi transmis clientului.
Deși această abordare ne oferă mai mult control, există câteva lucruri pe care ar trebui să le știți. În primul rând, serverul PHP oferă doar un set minim de anteturi HTTP:
Conexiune: închisă Tip conținut: text/html Gazdă: aws-dev-01.vtardia.com X-Powered-By: PHP/5.4.0RC7 D
Comparați acest lucru cu anteturile returnate de serverul Apache:
Accept-Range: octeți Conexiune: Keep-Alive Lungime conținut: 631 Content-Type: text/html Data: Sam, 04 Feb 2012 18:24:42 GMT Etag: "bbb99-277-4ace8c5470a40" Keep-Alive: timeout= 15, max=100 Ultima modificare: miercuri, 14 septembrie 2011 15:54:09 GMT Server: Apache/2.2.21 (Unix) DAV/2
Dacă aplicația dvs. folosește anteturi, atunci trebuie să țină cont de diferența dintre mediul de dezvoltare și cel de producție.
În al doilea rând, serverul încorporat are un SAPI (Server API) diferit. Astfel, efectuând rutarea în index, php, puteți determina dacă scriptul este accesat pe un server de testare sau de producție. php_sapi_name() va returna „cli-server” pe serverul încorporat:
Există o directivă INI specială - „cli_server.color”. Această directivă returnează ieșirea colorată în consolă. Creați un fișier gol numit cli-server.iniși lipiți această linie:
cli_server.color = on
Puteți crea o configurație unică de mediu pentru serverul dumneavoastră specificând directivele necesare în fișierul dumneavoastră INI. Directivele care nu sunt declarate își vor prelua valorile implicite. Acum am declarat o singură directivă - cli_server.color.
Porniți serverul cu parametrul „-c” care specifică fișierul INI:
$ php -S localhost -c cli-server.ini
Dacă terminalul dvs. acceptă culori, veți putea vedea ieșirea „culoare” în consolă. Starea 200 va fi evidențiată în verde, starea 404 va fi evidențiată în portocaliu, iar erorile de script vor fi evidențiate cu roșu.

Crearea unui server personal

Acum că știi tot ce trebuie să știi despre serverul încorporat, hai să facem ceva tare. Să ne creăm propriul server portabil!
Voi începe cu următoarea structură pentru aplicația noastră:

Folderul „bibliotecă” conține codul aplicației, „public” este directorul rădăcină, conține index.php și câteva fișiere statice. O atenție deosebită în acest tutorial va fi acordată folderului „server”, astfel că aplicația noastră va consta dintr-un simplu „Hello Word!” si mai multe imagini si css.
Scopul nostru este să putem porni serverul din directorul aplicației cu o singură comandă, iar serverul nostru se va ocupa de rutare, antete HTTP și erori.
$./start.sh
Să ne uităm la scriptul de pornire:
#! /bin/bash INIFILE="$(pwd)/server/server.ini" DOCROOT="$(pwd)/public" ROUTER="$(pwd)/server/router.php" HOST=0.0.0.0 PORT=8080 PHP=$(care php) dacă [ $? != 0 ] ; apoi echo „Nu se poate găsi PHP” exit 1 fi $PHP -S $HOST:$PORT -c $INIFILE -t $DOCROOT $ROUTER
Presupun că scriptul este rulat din directorul aplicației, așa că INIFILE, DOCROOT, ROUTER sunt definite folosind pwd. Calea către php este determinată folosind comanda which. Dacă php nu a fost găsit în $PATH al utilizatorului, scriptul va eșua.
Acest lucru funcționează destul de bine, dar să dăm utilizatorului posibilitatea de a schimba oricare dintre parametrii dați din linia de comandă, de exemplu:
dacă [! -z $INIFILE ]; apoi INIFILE="$(pwd)/server/server.ini" fi
Să continuăm, folderul „erori” conține fișiere pentru mesajele de eroare HTTP. Iată un exemplu despre o eroare 403: deși am folosit doar HTML, scriptul va fi conectat, folosesc include deci poți folosi orice cod php:
403

403: Interzis

Ne pare rău, resursa solicitată nu este accesibilă.

Acum să ne uităm la router.php. Scopul acestui fișier este de a primi și gestiona toate cererile și de a le transmite către server numai dacă acest fișier există. Toate paginile de eroare sunt afișate prin conectarea unui șablon.
În primele rânduri definesc niște parametri globali, precum DIRECTORY_INDEX, directorul cu șabloane de eroare. Parametrul date_default_timezone_set() trebuie să se potrivească cu setările sistemului de operare, altfel vor exista neconcordanțe între intrările din jurnal și de pe server. Am adăugat și o listă de adrese IP permise pentru a crește securitatea.
Funcția logAccess() este necesară deoarece atunci când scriptul de rutare primește o solicitare, jurnalul serverului este ignorat implicit. Funcția acceptă doar un cod de stare, iar formatul de ieșire se potrivește pe deplin cu formatul serverului.
Prima noastră sarcină este o verificare de securitate. Dacă IP-ul clientului nu se află în matricea de IP-uri permise, afișăm un mesaj de eroare și încheiem scriptul. Trebuie să dăm un alt cod de stare decât 200 și funcția header() nu va funcționa aici, așa că folosim o nouă funcție - http_response_code.
Dacă IP-ul clientului se află în matricea de IP-uri permise, atunci următorul nostru pas este să obținem calea și extensia fișierului solicitate. Dacă extensia este goală, presupunem că utilizatorul solicită un folder și construiește calea folosind DIRECTORY_INDEX definit mai întâi.
În cele din urmă, dacă fișierul solicitat există, returnăm FALSE și permitem serverului să acceseze fișierul. Dacă nu, este afișat un mesaj de eroare 404.

Relua

Asta e tot. După cum puteți vedea, serverul php este ușor de utilizat. Serverul nostru personal este foarte simplu. Codul poate fi optimizat și inclus în clase mai complexe și funcționale. Codare fericită!

p.s. Voi accepta cu plăcere criticile și comentariile la traducere într-un mesaj personal.

Elementul $_SERVER["DOCUMENT_ROOT"] conține calea către directorul rădăcină al serverului, dacă scriptul este executat într-o gazdă virtuală, acest element specifică calea către directorul rădăcină al gazdei virtuale; Aceste. în fișierul de configurare httpd.conf, gazda virtuală are o directivă DocumentRoot setată la „D:/main”, elementul $_SERVER[“DOCUMENT_ROOT”] va conține valoarea „D:main”.

element $_SERVER[„HTTP_ACCEPT”].

Elementul $_SERVER["HTTP_ACCEPT"] descrie preferințele clientului pentru tipul de document. Conținutul acestui element este preluat din antetul Accept HTTP trimis de client către server. Conținutul acestui antet ar putea arăta astfel

Imagine/gif, imagine/x-xbitmap, imagine/jpeg, imagine/pjpeg, aplicație/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*

Antetul Accept vă permite să specificați tipul media pe care clientul preferă să îl primească ca răspuns la cererea sa. Acest antet informează serverul că răspunsul este limitat la un set mic de tipuri preferate.

Simbolul * este folosit pentru a grupa tipuri într-o serie media. De exemplu, simbolul */* specifică utilizarea tuturor tipurilor, iar tipul de notație/* specifică utilizarea tuturor subtipurilor tipului de tip selectat.

Comentariu

Tipurile media sunt separate prin virgule.

Fiecare serie media este, de asemenea, caracterizată de un set suplimentar de parametri. Unul dintre ele este așa-numitul coeficient de preferință relativă q, care ia valori de la 0 la 1, respectiv, de la tipurile mai puțin preferate la cele mai preferate. Utilizarea mai multor parametri q permite clientului să spună serverului preferința sa relativă pentru un anumit tip de media.

Comentariu

În mod implicit, parametrul q este 1. De asemenea, este separat de tipul media printr-un punct și virgulă.

În mod implicit, parametrul q este 1. De asemenea, este separat de tipul media printr-un punct și virgulă.

Accept: audio/*; q=0,2, audio/de bază

În acest antet, primul tip este audio/*, care include toate documentele muzicale și se caracterizează printr-un coeficient de preferință de 0,2. Separat prin virgule, este indicat tipul audio/de baza, pentru care nu este specificat coeficientul de preferinta si ia o valoare implicita de unu. Citarea acestui titlu poate fi interpretată astfel: „Prefer tipul audio/de bază, dar pot trimite și documente de orice alt tip audio, dacă sunt disponibile, după reducerea factorului de preferință cu mai mult de 80%”.

În acest antet, primul tip este audio/*, care include toate documentele muzicale și se caracterizează printr-un coeficient de preferință de 0,2. Separat prin virgule, este indicat tipul audio/de baza, pentru care nu este specificat coeficientul de preferinta si ia o valoare implicita de unu. Citând RFC2616, acest titlu poate fi interpretat astfel: „Prefer tipul audio/de bază, dar pot trimite și documente de orice alt tip audio, dacă sunt disponibile, după reducerea factorului de preferință cu mai mult de 80%”.

Accept: text/plan simplu; q=0,5, text/html,
text/x-dvi; q=0,8, text/x-c

Comentariu

Rețineți că elementul $_SERVER["HTTP_ACCEPT"] conține exact aceleași informații, dar fără antetul inițial Accept.

Acest antet este interpretat după cum urmează: Sunt preferate tipurile de document text/html și text/x-c, dar dacă acestea nu sunt disponibile, atunci clientul care face această solicitare va prefera text/x-dvi și, dacă nu este disponibil, poate accepta tipul text/ simplu

Rețineți că elementul $_SERVER["HTTP_ACCEPT"] conține exact aceleași informații, dar fără antetul inițial Accept.

Elementul $_SERVER["HTTP_ACCEPT_LANGUAGE"] descrie preferințele de limbă ale clientului. Aceste informații sunt extrase din antetul HTTP Accept-Language pe care clientul îl trimite către server. Se poate da următorul exemplu:

Accept-Language: ru, en; q=0,7

Ceea ce poate fi interpretat astfel: clientul preferă limba rusă, dar dacă aceasta nu este disponibilă, este de acord să accepte documente în limba engleză. Elementul $_SERVER["HTTP_ACCEPT_LANGUAGE"] va conține exact aceleași informații, dar fără antetul Accept-Language:

Ru, en; q=0,7

Conținutul elementului $_SERVER["HTTP_ACCEPT_LANGUAGE"] poate fi folosit pentru a determina naționalitatea vizitatorilor. Cu toate acestea, rezultatele vor fi aproximative, deoarece mulți utilizatori folosesc versiuni în limba engleză ale browserelor, care vor anunța serverul că vizitatorul preferă o singură limbă - engleza.

Element $_SERVER[„HTTP_HOST”]

Elementul $_SERVER["HTTP_HOST"] conține numele serverului, care de obicei se potrivește cu numele de domeniu al site-ului situat pe server. De obicei, numele specificat în acest parametru este același cu numele $_SERVER[„SERVER_NAME”]. Parametrul conține doar numele domeniului fără numele protocolului (http://), adică.

www.sofftime.ru

Element $_SERVER[„HTTP_REFERER”]

Elementul $_SERVER["HTTP_REFERER"] conține adresa paginii de la care vizitatorul a ajuns la această pagină. Tranziția trebuie efectuată printr-un link. Să creăm două pagini index.php și page.php.

pagina index.php

ecou "Link către pagina PHP
"
;
$_SERVER[„HTTP_REFERER”]
?>

Pagina page.php va avea un conținut similar, dar linkul va indica pagina index.php.

Pagina page.php

ecou "Link către pagina PHP
"
;
echo "Conținutul $_SERVER ["HTTP_REFERER"] - " .
$_SERVER[„HTTP_REFERER”]
?>

La trecerea de la o pagină la alta, sub link va fi afișată adresa paginii de la care s-a făcut tranziția.

Element $_SERVER[„HTTP_USER_AGENT”]

Elementul $_SERVER["HTTP_USER_AGENT"] conține informații despre tipul și versiunea browserului și a sistemului de operare al vizitatorului.

Iată un conținut tipic al acestei linii: „Mozilla/4.0 (compatibil; MSIE 6.0; Windows NT 5.1)”. Prezența subșirului „MSIE 6.0” indică faptul că vizitatorul vizualizează pagina folosind Internet Explorer versiunea 6.0. Linia „Windows NT 5.1” indică faptul că sistemul de operare este Windows XP.

Comentariu

Pentru Windows 2000, elementul $_SERVER["HTTP_USER_AGENT"] arată astfel: "Mozilla/4.0 (compatibil; MSIE 5.01; Windows NT 5.0)"), în timp ce pentru Windows XP arată ca "Mozilla/4.0 (compatibil; MSIE 6.0) ;Windows NT 5.1)".

Dacă vizitatorul folosește browserul Opera, conținutul $_SERVER["HTTP_USER_AGENT"] ar putea arăta astfel: "Mozilla/4.0 (compatibil; MSIE 5.0; Windows 98) Opera 6.04". Aici este prezent și subșirul „MSIE 6.0”, indicând faptul că browserul Opera este compatibil cu browserul Internet Explorer și folosește aceleași biblioteci dinamice Windows. Prin urmare, atunci când analizați șirul returnat de browser, trebuie să aveți în vedere că Internet Explorer se referă la un șir care conține subșirul „MSIE 6.0” și care nu conține subșirul „Opera”. În plus, din această linie putem concluziona că utilizatorul folosește sistemul de operare Windows 98.

Comentariu

Agentul utilizator al browserului Firefox ar putea arăta astfel: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5.

Când utilizați browserul Netscape, conținutul elementului $_SERVER["HTTP_USER_AGENT"] ar putea arăta astfel: "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1" . Apartenența acestui browser poate fi determinată de prezența subșirului „Netscape”. În plus, puteți afla că vizitatorul accesează Internetul folosind o versiune de operare a Linux, cu un kernel optimizat pentru Pentium IV, în timp ce se află în shell-ul grafic X-Window. Acest mecanism este convenabil de utilizat pentru a colecta informații statistice, ceea ce le permite designerilor să optimizeze paginile pentru cele mai comune browsere.

Când utilizați browserul Netscape, conținutul elementului $_SERVER["HTTP_USER_AGENT"] ar putea arăta astfel: "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1" . Apartenența acestui browser poate fi determinată de prezența subșirului „Netscape”. În plus, puteți afla că vizitatorul accesează Internetul folosind o versiune de operare a Linux, cu un kernel optimizat pentru Pentium IV, în timp ce se află în shell-ul grafic X-Window. Acest mecanism este convenabil de utilizat pentru a colecta informații statistice, ceea ce le permite designerilor să optimizeze paginile pentru cele mai comune browsere.

Elementul $_SERVER["REMOTE_ADDR"] conține adresa IP a clientului. Când testați pe o mașină locală, această adresă va fi egală cu 127.0.0.1. Totuși, la testarea în rețea, variabila va returna adresa IP a clientului sau ultimul server proxy prin care clientul a ajuns la server. Dacă clientul folosește un server proxy, puteți afla adresa IP a acestuia folosind variabila de mediu HTTP_X_FORWARDED_FOR, a cărei valoare poate fi obținută folosind funcția getenv().

Comentariu

Serverele proxy sunt servere intermediare speciale care oferă un tip special de serviciu: comprimarea traficului, codificarea datelor, adaptarea pentru dispozitive mobile etc. Printre numeroasele servere proxy, există așa-numitele servere proxy anonime, care vă permit să ascundeți adresa IP adevărată a clientului, astfel de servere nu returnează variabila de mediu HTTP_X_FORWARDED_FOR.

Se preia variabila de mediu HTTP_X_FORWARDED_FOR

echo getenv(HTTP_X_FORWARDED_FOR);
?>

echo getenv(HTTP_X_FORWARDED_FOR);

Elementul $_SERVER["SCRIPT_FILENAME"] conține calea absolută către fișier de la rădăcina discului. Deci, dacă serverul rulează sistemul de operare Windows, atunci această cale poate arăta astfel: „d:main estindex.php”, adică. calea este specificată de pe disc într-un sistem de operare asemănător UNIX, calea este specificată din directorul rădăcină /, de exemplu „/var/share/www/test/index.php”.

Element $_SERVER[„SERVER_NAME”]

Elementul $_SERVER[„SERVER_NAME”] conține numele serverului, care de obicei se potrivește cu numele de domeniu al site-ului aflat pe acesta. De exemplu,

www.site

Conținutul elementului $_SERVER["SERVER_NAME"] este adesea același cu conținutul elementului $_SERVER["HTTP_HOST"]. Pe lângă numele serverului, matricea superglobală $_SERVER vă permite să aflați o serie de parametri ai serverului, de exemplu, adresa IP a serverului, portul de ascultare, ce server Web este instalat și versiunea protocolului HTTP. Aceste informații sunt plasate în elementele $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"] și, respectiv, $_SERVER["SERVER_PROTOCOL". Mai jos este un exemplu de utilizare a acestor elemente.

Conținutul elementului $_SERVER["SERVER_NAME"] este adesea același cu conținutul elementului $_SERVER["HTTP_HOST"]. Pe lângă numele serverului, matricea superglobală $_SERVER vă permite să aflați o serie de parametri ai serverului, de exemplu, adresa IP a serverului, portul de ascultare, ce server Web este instalat și versiunea protocolului HTTP. Aceste informații sunt plasate în elementele $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"] și, respectiv, $_SERVER["SERVER_PROTOCOL".

Mai jos este un exemplu de utilizare a acestor elemente.
" ;
ecou „Adresa IP a serverului – „ echo "Nume server - " . $_SERVER[„SERVER_NAME”]. "
" ;
echo "Port server - " . $_SERVER[„SERVER_PORT”]. "
" ;
echo "Server web - " . $_SERVER[„SOFTWARE_SERVER”]. "
" ;
ecou "Versiunea protocolului HTTP - " echo "Server web - " . $_SERVER[„SOFTWARE_SERVER”]. "
" ;
?>

Cei care au studiat mai mult sau mai puțin serios PHPștiți că există o matrice globală foarte utilă în PHP care se numeste $_SERVER. Și în acest articol aș dori să analizez cele mai populare chei și valorile lor din această matrice, deoarece cunoașterea lor este pur și simplu obligatorie chiar și pentru un începător Programator PHP.

Înainte de a începe matrice globală $_SERVER în PHP, vă dau un mic indiciu imediat. Există o caracteristică grozavă încorporată PHP, care se numește phpinfo(). Să dăm imediat un exemplu de utilizare a acestuia:

phpinfo();
?>

Ca rezultat al executării acestui script simplu, veți vedea un tabel imens cu diverse Setări pentru interpretul PHP, inclusiv, aproape de sfârșit va exista un tabel cu valori matrice globală $_SERVER. Acesta va lista toate cheile și toate valorile lor corespunzătoare. Cum te poate ajuta asta? Și adevărul este că dacă aveți nevoie de aceasta sau acea valoare și uitați cum se numește cheia, atunci folosiți funcția phpinfo()Îți poți aminti întotdeauna numele. În general, vei executa acest script și mă vei înțelege imediat.

Acum să trecem la cele mai populare la cheile matricei $_SERVER:

  • HTTP_USER_AGENT- această cheie vă permite să aflați caracteristicile clientului. În cele mai multe cazuri, acesta este cu siguranță browserul, însă nu întotdeauna. Și din nou, dacă este un browser, atunci care, puteți afla despre el în această variabilă.
  • HTTP_REFERER- conține calea absolută către acel fișier ( Script PHP, Pagina HTML), de la care am trecut la acest script. În linii mari, de unde a venit clientul.
  • SERVER_ADDR - adresa IP server.
  • REMOTE_ADDR - adresa IP client.
  • DOCUMENT_ROOT- calea fizică către directorul rădăcină al site-ului. Această opțiune este setată prin Fișierul de configurare a serverului Apache.
  • SCRIPT_FILENAME- calea fizică către scriptul apelat.
  • QUERY_STRING- o valoare foarte utilă care vă permite să obțineți un șir cu o solicitare și apoi puteți analiza acest șir.
  • REQUEST_URI- o valoare și mai utilă care conține nu numai cererea în sine, ci și calea relativă către scriptul apelat de la rădăcină. Acesta este foarte des folosit pentru a elimina duplicarea din index.php, adică atunci când avem așa ceva URL: "http://mysite.ru/index.php" Și " http://mysite.ru/" duce la o pagină și URL-uri diferit, deci duplicarea, care va avea un efect negativ asupra optimizării motoarelor de căutare. Și cu ajutorul REQUEST_URI putem determina: cu index.php sau nu s-a numit scenariul. Și putem face o redirecționare cu index.php(dacă a fost prezent în REQUEST_URI) pe fără index.php. Ca urmare, atunci când trimiteți o astfel de solicitare: " http://mysite.ru/index.php?id=5„, vom avea o redirecționare către URL: "http://mysite.ru/?id=5„. Adică am scăpat de duplicare eliminând din URL acest index.php.
  • SCRIPT_NAME- cale relativă către scriptul apelat.

Poate acestea sunt toate elementele matrice globală $_SERVER în PHP care sunt folosite în mod regulat. Trebuie să le cunoașteți și să le puteți folosi atunci când este necesar.

  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva