Počet online čtenářů v PHP bez použití databáze

27. září 2003

Vypsat počet lidí, kteří si právě pročítají naše stránky, můžeme velmi snadno například s využitím databáze a sessions. Dalším možným řešením je evidovat IP adresy klientů a sledovat jejich timeout jen prostřednictvím textového souboru.

Princip spočívá v uložení IP adresy a případně dalších údajů klienta spolu s časem posledního přístupu. Data se ukládají do souboru a pomocí cyklu se čtou. Dvojtečka slouží v řádku jako oddělovač adresy návštěvníka a času, kdy naposledy načetl nějakou stránku. Pro další detaily odkazuji na článek využívající k ukládání dat databázi. Můžete se podívat na ukázku. Celý skript si můžete také stáhnout.

<?php
$fcrr=’readers.txt‘; // jméno souboru, do kterého ukládat IP adresy návštěvníků
$IPadresa=$_SERVER[‚REMOTE_ADDR‘]; // sem „naskládame“ vše, co lze o čtenáři zjistit odděleno zavináčem (adresy uživatelů za proxy ap.)
if ($_SERVER[‚REMOTE_HOST‘])
  $IPadresa.=’@‘.$_SERVER[‚REMOTE_HOST‘];
if ($_SERVER[‚HTTP_X_FORWARDED_FOR‘])
  $IPadresa.=’@‘.$_SERVER[‚HTTP_X_FORWARDED_FOR‘];
if ($_SERVER[‚HTTP_FORWARDED‘])
  $IPadresa.=’@‘.$_SERVER[‚HTTP_FORWARDED‘];
if ($_SERVER[‚HTTP_CLIENT_IP‘])
  $IPadresa.=’@‘.$_SERVER[‚HTTP_CLIENT_IP‘];
if ($_SERVER[‚X_HTTP_FORWARDED_FOR‘])
  $IPadresa.=’@‘.$_SERVER[‚X_HTTP_FORWARDED_FOR‘];
if ($_SERVER[‚X_FORWARDED_FOR‘])
  $IPadresa.=’@‘.$_SERVER[‚X_FORWARDED_FOR‘];
$aktual=time();
$pole=file($fcrr); //přiřadit jméno souboru k poli
for($i=0; $i<Count($pole); $i++) // procházet pole
{
  $adresa=StrTok($pole[$i],‘:‘); // rozdělit na adresu a čas záznamy oddělené dvojtečkou
 $cas=StrTok(‚:‘);
  if ($adresa==$IPadresa) // pokud se adresa rovná některému záznamu, vyřadit jej (vymazat) z pole
    $pole[$i]=“;
  if ($cas<($aktual-360)) // pokud vypršel timeout 6 minut, vyřadit záznam (vyřadí se neaktivní uživatelé)
    $pole[$i]=“;
}
$Fp=FOpen($fcrr,’w‘); // otevřít soubor pro zápis
$celkem=0; // vyčistit proměnnou
for($i=0; $i<Count($pole); $i++)
{
  if ($pole[$i]!=“) // je-li co zapsat po předchozím „vyčištění“ pole
  {
    FPutS($Fp,$pole[$i]); // pak zapsat prvek pole do souboru
    $celkem++; // zvýšit počítadlo uživatelů
  }
}
FPutS($Fp,$IPadresa.‘:‘.$aktual.“\n“); // připsat adresu aktuálního uživatele a jeho čas
$celkem++; // zvýšit počítadlo o 1 (o aktuálního uživatele)
FClose($Fp); // zavřít soubor
// v $celkem je nyní počet uživatelů online
$mess1=’čte‘;
$mess2=’lidí‘;
if ($celkem<5)
  if ($celkem>1)
  {
    $mess1=’čtou‘;
    $mess2=’lidé‘;
  }
  else
    $mess2=’člověk‘; // vyskloňovat podle počtu uživatelů
echo „Stránku si právě $mess1 $celkem $mess2.“; // vypsat počet uživatelů se správným skloňováním
?>

V prvním řádku skriptu je nastaveno jméno souboru, který má sloužit pro ukládání dat. Můžeme jej dát i do nějakého adresáře, cestu je pak třeba uvést také ve skriptu. Všimněte si, že zde nepracujeme jen s IP adresou (REMOTE_ADDR), ale snažíme se uložit co nejvíce údajů z hlaviček, které odeslal browser klienta. Pokud bychom počítali pouze IP adresy, měření by bylo nepřesné v případě sítě s více uživateli připojenými přes proxy – jejich adresa je navenek jediná a tak by třeba i sto čtenářů bylo v našem skriptu bráno jako jeden čtenář. Pokud taková proxy poskytuje v odesílaných hlavičkách například údaj HTTP_FORWARDED, měření bude přesnější. Jak je vidět z posledních řádků skriptu, je vyřešeno i správné skloňování při počtu čtenářů 1, 2 až 4, 5 a více čtenářů.

Uvedený skript pomocí include zahrneme do všech stránek, ve kterých chceme zobrazovat a počítat aktuální počet čtenářů například takto:

<html>
  <head>
    <meta http-equiv=“Content-Type“ content=“text/html; charset=windows-1250″>
    <title>Počet online uživatelů</title>
  </head>
  <body>
    <p>Toto je velmi zajímavá stránka.</p>
    <p><?php include(‚readers.php‘); ?></p>
  </body>
</html>

Nakonec je nutné nastavit práva pro zápis do souboru readers.txt, který je nutné nahrát také na server – podrobný návod naleznete v článku o návštěvní knize.

Pozn. red.: Tento článek vyšel poprvé 13. 8. 2002. Původní verze článku a k němu vedené diskuse jsou vám k dispozici v ZIP archivech.

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

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

Předchozí článek ivanos
Další článek freehry.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *