Cht∞l bych mφt na sv²ch strßnkßch poΦφtadlo p°φstup∙, kterΘ bude opravdu odpovφdat poΦtu nßvÜt∞v strßnky. Pokud na strßnku za°adφm poΦφtadlo jako obrßzek, mohou b²t poΦty p°φstup∙ ovlivn∞ny i z jin²ch strßnek. Navφc se nezapoΦφtßvajφ p°φstupy z textov²ch prohlφ₧eΦ∙ (Lynx) a z prohlφ₧eΦ∙ s vypnut²mi obrßzky.
Hned z poΦßtku musφme p°iznat, ₧e opravdu spolehliv² zdroj p°esnΘho poΦtu p°φstup∙ ke strßnkßm dnes neexistuje. PoΦφtadla p°φstup∙ za°azovanß na strßnky pomocφ CGI-skriptu, kter² generuje obrßzek s poΦtem p°φstup∙, majφ mnoho nev²hod a lze je napadnout z mnoha stran. Jejich velkß v²hoda spoΦφvß v tom, ₧e je lze za°adit na libovolnou strßnku. Pokud si takovΘ poΦφtadlo chcete za°adit na strßnku, obvykle zφskßte pot°ebnΘ informace u vaÜeho poskytovatele p°ipojenφ. Rovn∞₧ m∙₧ete vyu₧φt ve°ejn∞ p°φstupnΘ poΦφtadlo na adrese http://pocitadlo.pinknet.cz.
Asi nejspolehliv∞jÜφ metodou pro zφskßnφ poΦtu p°φstup∙, je anal²za log-soubor∙ na serveru. V t∞chto souborech jsou ulo₧eny zßznamy o vÜech strßnkßch poskytnut²ch serverem. Jedin² problΘm je v tom, ₧e n∞kterΘ strßnky jsou u₧ivatel∙m poskytnuty z vyrovnßvacφch pam∞tφ proxy-server∙. Server nabφzejφcφ danou strßnku, pak o p°φstupu v∙bec nevφ a statistika je zkreslenß.
ProblΘm s proxy-servery lze jednoduÜe vy°eÜit tφm, ₧e se zakß₧e
uklßdßnφ strßnky do vyrovnßvacφch pam∞tφ. Nenφ to vÜak zdaleka nejlepÜφ
°eÜenφ, proto₧e se tφm zvednou nßroky na p°enosovou kapacitu
Internetu. Uklßdßnφ do vyrovnßvacφch pam∞tφ lze zakßzat pomocφ HTTP
hlaviΦek Pragma
, Cache-Control
a
Expires
. Tak nap°φklad hlaviΦka Expires
obsahuje Φas, do kdy je strßnka platnß. Pokud ho tedy nastavφme na Φas
odeslßnφ strßnky, nebude strßnka uklßdßna v pam∞ti ₧ßdnΘho
proxy-serveru. Pro nastavenφ hlaviΦky na sprßvnou hodnotu m∙₧eme ve
skriptovacφm jazyku PHP na zaΦßtek strßnky umφstit p°φkaz
Header("Expires: " . GMDate("D, d M Y H:i:s") . " GMT");
Nynφ mßme p°ipravenu p∙du pro spolehlivΘ poΦφtadlo. StaΦφ vytvo°it krßtk² skript, kter² bude generovat poΦty p°φstup∙ a za°azovat je p°φmo do textu strßnky -- poΦet p°φstup∙ bude vid∞t ve vÜech prohlφ₧eΦφch a bude odpovφdat realit∞, proto₧e strßnky nebudou nikdy naΦφtßny z vyrovnßvacφ pam∞ti proxy-server∙.
NßÜ skript bude uklßdat poΦty p°φstup∙ ke ka₧dΘ strßnce do zvlßÜtnφho souboru. P°i ka₧dΘm p°φstupu se ze souboru p°eΦte aktußlnφ poΦet p°φstup∙, zv²Üφ se o jedna, zobrazφ se a zapφÜe zp∞t do souboru.
Dostßvßme se tedy ke skriptu counter.php
:
<? function GetHits() { $datadir = "f:\\work\\counter\\"; // adresß° pro datovΘ soubory // na Unixu nap°. /var/counter $datafile = StrTR($GLOBALS["SCRIPT_NAME"], "./\\", "___"); // nahrazenφ nebezpeΦn²ch znak∙ ze jmΘna datovΘho souboru $filename = $datadir.$datafile.".dat"; // kompletnφ cesta k datovΘmu souboru if (File_Exists($filename)): // existuje datov² soubor? $fp = @FOpen($filename, "r+"); // otev°enφ souboru if (!$fp) return; $hits = FGetS($fp,10) + 1; // p°eΦtenφ poΦtu p°φstup∙ Rewind($fp); // p°φprava souboru na zßpis else: $fp = @FOpen($filename, "w"); // vytvo°enφ dat. souboru if (!$fp) return; $hits = 1; // inicializace poΦtu p°φstup∙ endif; FPutS($fp, $hits); // zapsßnφ novΘho poΦtu p°φstup∙ FClose($fp); // zav°enφ datovΘho souboru echo $hits; // vypsßnφ poΦtu p°φstup∙ } GetHits(); ?>
Za°azenφ poΦφtadla na strßnku je velice jednoduchΘ:
<?Header("Expires: " . GMDate("D, d M Y H:i:s") . " GMT")?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>Strßnka s poΦφtadlem</TITLE> </HEAD> <BODY> <H1>Strßnka s poΦφtadlem</H1> <P>Jste <?require "counter.php"?>. nßvÜt∞vnφk tΘto strßnky. </BODY> </HTML>