SpolehlivΘ poΦφtadlo p°φstup∙

Ji°φ Kosek ml.

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>
Obr.: Strßnka s poΦφtadlem
Strßnka s poΦφtadlem
© Ji°φ Kosek 1999