Navigace

Hlavní menu

 

Submenu

 

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

Vypsat počet lidí, kteří si právě pročítají naše stránky, můžeme podle návodu s využitím databáze. Výhodou je velmi jednoduché uvedení do chodu, nehodí se však pro stránky, které navštěvuje opravdu vysoký počet čtenářů, protože by byly zbytečně zpomalovány. Připravil jsem pro vás řešení, které tento problém vyřeší.

S trochou programování můžeme obdobné počítání realizovat pomocí textového souboru, princip je obdobný, jen 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 již zmíněný č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=$REMOTE_ADDR; // do $IPadresa "naskládat" vše, co lze o čtenáři zjistit odděleno zavináčem (adresy uživatelů za proxy ap.)
if ($HTTP_X_FORWARDED_FOR)
 $IPadresa.="@".$HTTP_X_FORWARDED_FOR;
if ($HTTP_FORWARDED)
 $IPadresa.="@".$HTTP_FORWARDED;
if ($HTTP_CLIENT_IP)
 $IPadresa.="@".$HTTP_CLIENT_IP;
if ($X_HTTP_FORWARDED_FOR)
 $IPadresa.="@".$X_HTTP_FORWARDED_FOR;
if ($X_FORWARDED_FOR)
 $IPadresa.="@".$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]="";
 endif;
 if ($cas<($aktual-360)): // pokud vypršel timeout 6 minut, vyřadit záznam (vyřadí se neaktivní uživatelé)
   $pole[$i]="";
 endif;
endfor;
$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ů
 endif;
endfor;
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. Jak je vidět z posledních řádků skriptu, je vyřešeno i správné skloňování při počtu čtenářů , 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ářů. 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.

Růžička, Pavel (13.8. 2002)
odborný redaktor Interval.cz
Diskuze: Počet online čtenářů v PHP bez použití databáze
2002-08-13 08:34:13František AugusztinRychlost
2002-08-13 22:23:11AgentRychlost
2002-08-14 10:11:06Hony<b>Jak otevrit a precist adresar?...
2002-08-14 23:29:48Petr Rymplersprosta kopie?
2002-08-15 09:12:37Marek Šalandasprosta kopie?
2002-08-15 10:50:34Petr Rymplersprosta kopie?
2002-08-15 11:00:57Marek Šalandasprosta kopie?
2002-08-15 11:43:18Petr Rymplersprosta kopie?
2002-08-15 12:32:45Marek Šalandasprosta kopie?
2002-08-15 12:44:21Pavel Růžičkasprosta kopie?
2002-08-30 20:38:01Killersprosta kopie?
2002-08-30 20:45:04Killersprosta kopie?
2002-08-30 20:21:50KillerTy šmejde!
2002-08-31 09:12:20LopuchTy šmejde!
2002-12-12 09:07:37PetrTy šmejde!
2003-08-14 07:54:32treioV čem je chyba?
2003-08-14 21:34:24Jméno a příjmeníV čem je chyba?
2003-09-01 10:47:20laloV čem je chyba?