Určitě jste někdy potřebovali zjistit IP adresu nebo doménovou adresu návštěvníka vašich stránek, jméno právě prováděného skriptu či jména stránek, které odkazují na váš server. Další údaje o návštěvníkovi (typ prohlížeče a operačního systému) se mohou také hodit. Jak se dají tyto a mnohé další informace snadno získat?

Proměnné prostředí (Environment variables) jsou předdefinované proměnné, které máte k dispozici v každém skriptu. PHP umožňuje využít celou řadu proměnných prostředí. Jejich počet je závislý na typu a verzi webserveru a na verzi samotného PHP. Seznam všech těchto proměnných a jejich hodnot lze získat použitím funkce PHPInfo().

Přehled

V následující tabulce je uvedena většina proměnných prostředí. Jak bylo napsáno výše, jejich počet závisí na mnoha faktorech, proto jsou některé méně důležité proměnné vynechány. Ty nejdůležitější, které budete používat nejčastěji, jsou zvýrazněny tučným písmem. Všechny proměnné začínající na „HTTP“ jsou vlastně HTTP hlavičky (např. $HTTP_ACCEPT je hlavička Accept).

PROMĚNNÁ POPIS PŘÍKLAD
$GATEWAY_INTERFACE verze CGI rozhraní, kterou server používá CGI/1.1
$SERVER_NAME adresa serveru, na kterém skript běží (pokud se jedná o virtuální server, obsahuje proměnná tuto hodnotu) www.interval.cz
$SERVER_SOFTWARE jméno a verze webserveru Apache/1.3.12 (Win32)
$SERVER_PROTOCOL jméno a verze protokolu, přes který přišel požadavek HTTP/1.1
$REQUEST_METHOD metoda požadavku (GET, POST, HEAD, PUT) GET
$QUERY_STRING data předaná odkazem (= vše, co je za otazníkem) id=1&page=10
$DOCUMENT_ROOT kořenový adresář webserveru /home/www
$HTTP_ACCEPT data, která klient (prohlížeč) podporuje image/gif
$HTTP_ACCEPT_CHARSET znakové sady podporované klientem iso-8859-2
$HTTP_ACCEPT_ENCODING kódování (např. komprese) přijatelné klientem gzip
$HTTP_ACCEPT_LANGUAGE jazyk preferovaný klientem cs
$HTTP_CONNECTION podmínky spojení (Keep-Alive, Close) Keep-Alive
$HTTP_HOST adresa serveru, kterému se klade požadavek www.interval.cz
$HTTP_REFERER adresa stránky, která odkázala na aktuální stránku http://interval.cz/.. ../index.asp
$HTTP_USER_AGENT jméno a verze prohlížeče a operačního systému Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)
$REMOTE_ADDR IP adresa počítače, ze kterého přišel požadavek 212.90.231.68
$HTTP_X_FORWARDED_FOR pokud $REMOTE_ADDR obsahuje IP proxy serveru, obsahuje (ne vždy) $HTTP_X_FORWARDED_FOR IP adresu počítače, ze kterého přišel požadavek 212.90.231.68
$REMOTE_HOST doménová adresa počítače, ze kterého přišel požadavek (nemusí vždy fungovat) hk.interval.cz
$REMOTE_PORT port používaný na počítači, ze kterého přišel požadavek, ke komunikaci se serverem 1059
$SCRIPT_FILENAME absolutní cesta k právě prováděnému skriptu (souboru) /home/www/.. ../variables.php
$SERVER_ADDR IP adresa serveru 127.0.0.1
$SERVER_ADMIN hodnota konfigurační direktivy ServerAdmin u webserveru Apache (nejčastěji email administrátora) you@your.address
$SERVER_PORT port, na kterém běží webserver 80
$SERVER_SIGNATURE jméno, verze a port serveru – „podpis serveru“ přidávaný na serverem generované stránky (např. výpisy souborů) Apache/1.3.12 Server at localhost Port 80
$PATH_TRANSLATED absolutní cesta k právě prováděnému skriptu, včetně extra informací * (pokud URL obsahuje i extra informace, chybí v $PATH_TRANSLATED jméno skriptu) /home/www/pages/.. ../extra
$SCRIPT_NAME cesta k právě prováděnému skriptu /pages/variables.php
$REQUEST_URI URI použité v požadavku na stránku /pages/variables.php?id=10
$argv pole obsahující parametry předané skriptu při spouštění z příkazové řádky (indexováno od 0); pokud je skript volán metodou GET (přes prohlížeč), obsahuje toto pole hodnotu proměnné $QUERY_STRING id=10
$argc počet parametrů předaných skriptu při spouštění z příkazové řádky 4
$PHP_SELF cesta k právě prováděnému skriptu /pages/variables.php
$PATH_INFO extra informace * předané skriptu na konci URL (Linux) nebo cesta k právě prováděnému skriptu (Windows) /extra
$CONTENT_TYPE typ dat zaslaných metodou POST nebo PUT application/x-www-form-urlencoded
$CONTENT_LENGTH délka dat zaslaných metodou POST nebo PUT 135
$HTTP_COOKIE_VARS asociativní pole obsahující cookies předané skriptu  
$HTTP_GET_VARS asociativní pole obsahující všechny parametry předané skriptu metodou GET  
$HTTP_POST_VARS asociativní pole obsahující všechny parametry předané skriptu metodou POST  
$HTTP_POST_FILES asociativní pole obsahující proměnné s informacemi o poslaných souborech funguje od verze PHP 4.0.0
$HTTP_ENV_VARS asociativní pole obsahující proměnné předané skriptu daným prostředím (OS)  
$HTTP_SERVER_VARS asociativní pole obsahující proměnné předané skriptu webserverem (= většina proměnných popsaných na začátku tabulky)  

* máme-li odkaz http://www.interval.cz/pages/variables.php/extra?XXXX, extra informací se rozumí „/extra“

Asociativní pole $HTTP_*_VARS jsou inicializována pouze, pokud je zapnuta v php.ini (php3.ini) konfigurační direktiva „track_vars“. Od verze PHP 4.0.3 je tato direktiva zapnuta vždy a nejde vypnout.

Standardně je zapnuta i konfigurační direktiva „register_globals“, která umožňuje využívat jednotlivé proměnné z asociativních polí $HTTP_*_VARS i odděleně (např. HTTP_SERVER_VARS[„SERVER_PORT“] i $SERVER_PORT).

Některé proměnné se chovají na různých operačních systémech různě, což ilustruje i následující tabulka.

PROMĚNNÁ WINDOWS ME SLACKWARE LINUX
$SCRIPT_FILENAME c:/apache/php4/php.exe /home/www/pages/.. ../variables.php
$PATH_TRANSLATED c:\\lokal\\pages\\variables.php /home/www/pages/.. ../variables.php
$SCRIPT_NAME /php/php.exe /pages/variables.php
$PHP_SELF /php/php.exe/pages/variables.php /pages/variables.php
$PATH_INFO /pages/variables.php /extra

Další rozdíl je v tom, že většina nejdůležitějších proměnných ($SCRIPT_NAME, $SERVER_PORT, …) je v Linuxu v poli $HTTP_SERVER_VARS, zatímco ve Windows v poli $HTTP_ENV_VARS.

Funkce pro práci s proměnnými prostředí

string GetEnv(string varname)

Funkce GetEnv() vrací hodnotu proměnné prostředí varname. Funkci využijete hlavně v třídách při objektovém programování nebo ve vlastních funkcích.

function Moje_Funkce()
{
$server = getenv("SERVER_NAME");
}

nikoli

function Moje_Funkce()
{
$server = $SERVER_NAME;
}

void PutEnv(string settings)

Funkce PutEnv() umožňuje nastavení proměnné prostředí. Funkci použijete hlavně při volání externích programů, které potřebují nastavit nebo změnit proměnné prostředí.

putenv("LD_LIBRARY_PATH=/extra/library/lib");

Chod této funkce ovlivňují i dvě konfigurační direktivy, které však mají význam pouze, pokud je zapnuto „SAFE-MODE“ (bezpečný režim). První konf. direktiva „safe_mode_allowed_env_vars“ určuje předponu proměnných prostředí (např. „PHP_“), které půjdou nastavit či změnit. Druhá direktiva „safe_mode_protected_env_vars“ obsahuje proměnné prostředí, které nejdou v žádném případě změnit.

Výpis všech proměnných prostředí

Pro získání všech proměnných prostředí a jejich hodnot můžete použít funkci PHPInfo(). Můžete však využít i toho, že všechny proměnné prostředí jsou vlastně globální proměnné obsažené v poli $GLOBALS.

reset($GLOBALS);
while(Current($GLOBALS)):
    echo "Proměnná: " . Key($GLOBALS) . "<BR>";
    echo "Hodnota: " . Current($GLOBALS) . "<BR><BR>";
    Next($GLOBALS);
endwhile;

Doménová adresa počítače, ze kterého přišel požadavek

Doménová adresa se může hodit pro různé statistiky. V proměnné $REMOTE_HOST je však doménová adresa obsažena jen velmi zřídka. Proto použijte funkci GetHostByADDR(), která převádí IP adresu na adresu doménovou. Musíte však počítat s tím, že pokud $REMOTE_ADDR obsahuje IP proxy serveru, obsahuje (ne vždy) IP adresu počítače, ze kterého přišel požadavek, proměnná $HTTP_X_FORWARDED_FOR. Ta však může obsahovat několik adres oddělených čárkou, proto použijeme funkci Explode().

if($REMOTE_HOST!=""):
    $domain = $REMOTE_HOST;
else:
    if(IsSet($HTTP_X_FORWARDED_FOR)):
        $IP = Explode(„,“, $HTTP_X_FORWARDED_FOR);
        $domain = GetHostByADDR($IP[0]);
    else:
        $domain = GetHostByADDR($REMOTE_ADDR);
    endif;
endif;

Takové jsou tedy proměnné prostředí v PHP. Jak sami z několika příkladů vidíte, práce s nimi je vcelku jednoduchá.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět