Acesta este un script modest de contorizare si afisare a "mini" traficului unui site. Inregistreaza si afiseaza accesarile site-ului din ziua curenta si cea precedenta precum si ziua cu cele mai multe accesari si total accesari site de cand este inclus scriptul. De asemenea, inregistreaza si afiseaza vizitatori unici din ziua curenta, precedenta si recordul lor, precum si numar vizitatori online si data cu recordul de vizitatori online in acelasi timp.
Script-ul foloseste PHP, JavaScript si Ajax, pentru a functiona, serverul trebuie sa ruleze PHP. Datele pentru stocarea traficului si utilizatorilor online sunt salvate in fisiere .txt, astfel nu e nevoie de lucrul cu o baza de date.
Scriptul nu inregistreaza traficul facut de web bots (Googlebot, alexa, crawler, Gigabot, MSN, ..., si altele, in nr. de 93) si poate fi inclus atat in fisiere .php cat si .html (inclusiv blog-uri).
- Este eficient la site-uri mici si medii, cu pana in maxim 10 mii de pagini si 3-4 mii unici pe zi. In cazul site-urilor mai mari e recomandat utilizarea unui script ce foloseste baze de date (cum e MySQL).
Puteti utiliza /testa acest script folosind codul si instructiunile de mai jos, sau mai sigur, descarcati-l de la Download (dreapta-sus). In arhiva cu script-ul veti gasi, pe langa instructiunile de folosire, un model de test si fisierul ".htaccess" ce protejeaza directorul cu datele salvate.
<?php
// Script Mini-Trafic Site - de la http://www.marplo.net/php-mysql
session_start();
// Defineste Directorul si Fisiere de lucru in el
$dir = 'minitrafic/';
$file_ip = $dir.'ipuri.txt';
$file_minitrafic = $dir.'minitrafic.txt'; // Aici vor fi stocate datele mini-traficului (pe primul rand) si vizitatorii online
$sep = '^'; // Separator de date pt. Cookie si cele din primul rand din $file_minitrafic
date_default_timezone_set('Europe/Bucharest'); // Seteaza zona Romania pt. definirea datei
$azi = intval(date("d")); // Preia ziua curenta
// Defineste IP-ul vizitatorului (folosit pt. Vizitatori unici)
// Daca ip-ul e setat in cookie, impreuna cu ziua curenta la inceput, il preia pe cel din cookie
// Altfel il adauga intr-un cookie pe cel setat de PHP impreuna cu ziua curenta (expira in 24 ore)
$ip = $_SERVER['REMOTE_ADDR'];
if(isset($_COOKIE['visit_unic']) && strpos($_COOKIE['visit_unic'], $azi)===0) {
$ar_cookie = explode($sep, $_COOKIE['visit_unic']);
$ip = trim($ar_cookie[1]);
}
else setcookie("visit_unic", $azi.$sep.$ip, (time()+86400));
// Array cu o lista de 93 bots-search pe internet
$bot_list = array('Teoma', 'alexa', 'AbachoBOT', 'abcdatos_botlink', 'AESOP_com_SpiderMan', 'ia_archiver', 'Mercator', 'AltaVista-Intranet', 'Wget', 'Acoon Robot', 'AxmoRobot', 'Yellopet-Spider',
'Findexa Crawle', 'froogle', 'Gigabot', 'inktomi', 'looksmart', 'URL_Spider_SQL', 'Firefly', 'NationalDirectory', 'Ask Jeeves', 'TECNOSEEK', 'InfoSeek', 'WebFindBot', 'girafabot', 'crawler', 'www.galaxy.com',
'Googlebot', 'Scooter', 'Slurp', 'msnbot', 'appie', 'FAST', 'WebBug', 'Spade', 'ZyBorg', 'rabaz', 'Baiduspider', 'Feedfetcher-Google', 'TechnoratiSnoop', 'Rankivabot', 'Mediapartners-Google', 'Sogou web spider',
'WebAlta Crawler', 'urlck', 'solbot', 'acme-spider', 'searchprocess', 'poppi', 'AdsBot-Google', 'Baiduspider', 'Exabot', 'FAST Enterprise Crawler', 'FAST-WebCrawler', 'http://www.neomo.de/', 'Gigabot','Google Desktop',
'heise-IT-Markt-Crawler', 'heritrix/1.', 'ibm.com/cs/crawler', 'ICCrawler - ICjobs', 'ichiro/2', 'MJ12bot', 'MetagerBot', 'msnbot-NewsBlogs', 'msnbot', 'msnbot-media', 'NG-Search', 'http://lucene.apache.org/nutch/',
'NutchCVS', 'OmniExplorer_Bot', 'online link validator', 'psbot/0', 'Seekbot', 'Sensis Web Crawler', 'SEO search Crawler', 'Seoma', 'SEOsearch/', 'Snappy/1.1','http://www.tkl.iis.u-tokyo.ac.jp/~crawler', 'SynooBot',
'crawleradmin.t-info@telekom.de', 'TurnitinBot', 'voyager/1.0', 'W3 SiteSearch Crawler', 'W3C-checklink', 'W3C_*Validator', 'http://www.WISEnutbot.com', 'yacybot', 'Yahoo-MMCrawler', 'Yahoo! DE Slurp', 'Yahoo! Slurp', 'YahooSeeker');
// Functia care verifica daca cel care a accesat pagina e un bot, din lista de sus
function detect_bot() {
GLOBAL $bot_list;
$thebot = false;
if(isset($_SERVER['HTTP_USER_AGENT'])) {
foreach($bot_list as $bot) {
if(stripos($_SERVER['HTTP_USER_AGENT'], $bot)!==false) { $thebot = true; break;}
}
}
return $thebot;
}
$isbot = detect_bot(); // Daca e false inseamna ca nu e bot
// Functia pt. lucru cu fisierul pt. stocarea vizitatori unici azi (dupa ip)
// Daca fisierul exista, preia randurile din el.
// Adauga ip-ul curent in matricea cu randurile si elimina duplicatele
// Daca fisierul nu exista, il creaza cu ip-ul curent pe un rand
function ip_stoc($file, $ip) {
GLOBAL $isbot;
$rows = array($ip);
// Daca fisierul exista, preia randurile din el
// Nr. randuri reprezinta nr. vizitatori unici
if(is_file($file)) { $rows = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); }
// Daca nu e bot, parcurge randurile si la urma scrie in $file
if($isbot===false) {
$rows[] = $ip; // Adauga ip-ul curent in matrice, la sfarsit
$rows = array_unique($rows); // Elimina randurile identice
// Transforma matricea in sir (cu linii) si daca poate scrie in $file, seteaza sesiunea $_SESSION['minitrafic']
if(file_put_contents($file, implode("\r\n", $rows))) { $_SESSION['minitrafic'] = $ip; }
}
return count($rows); // Returneaza numarul de rand-uri (ip-uri stocate)
}
// Functia de lucru pt. datele stocate si vizitatori online
function trafic_on($id_useron, $file) {
GLOBAL $azi, $unici, $sep, $isbot;
$ar_on = array(); $ad_on = 0; $online = 1; $acum = time();
$user_on = $id_useron.$sep.($acum+30); // Randul pt. vizitatorul curent online
if(is_file($file)) {
$rows = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// Daca fisierul are cel putin un rand
if(count($rows)>0) {
// Preia data zilei, care e in prima linie (folosita pt. reset refereri cand se trece la o noua zi)
$row1 = $rows[0];
// De la al doilea rand sunt stocati useri online
// Daca sunt mai mult de 1 rand in fisier, le parcurge si separa datele
for($i=1; $i<count($rows); $i++) { $ar_on[] = $rows[$i]; }
// Prelucreaza datele pt useri_on
for($i=0; $i<count($ar_on); $i++) {
$row_on = explode($sep, $ar_on[$i]);
if($row_on[0]===$id_useron) {
$ar_on[$i] = $user_on;
$ad_on = 1;
continue;
}
if(intval($row_on[1])<$acum) unset($ar_on[$i]);
}
if($ad_on===0) $ar_on[] = $user_on;
$ar_on = array_unique($ar_on); // Elimina posibile randuri identice
$online = max(1, count($ar_on)); // Nr. utilizatori online
}
}
else {
// Seteaza datele pt. primul rand
// azi, acces_ieri, acces_azi, unici_ieri, unici_azi, online_azi, acces_tot, acces_top, unici_top, online_top, timp_acces_top, timp_unici_top, timp_online_top, timp_start
$row1 = $acum.$sep.'0'.$sep.'0'.$sep.'0'.$sep.'0'.$sep.'0'.$sep.'0'.$sep.'0'.$sep.'0'.$sep.'0'.$sep.$acum.$sep.$acum.$sep.$acum.$sep.$acum;
}
// Preia in Array elementele din primul rand si le transforma in integer
$ar_row1 = explode($sep, $row1);
$ar_row1 = array_map("intval", $ar_row1);
$start = $ar_row1[13]; // Preluare timp start inregistrare
// Daca nu e bot si primul rand are 14 elemente, actualizeaza primul rand
if(!$isbot && count($ar_row1)===14) {
// Daca nu e apelare repetitiva
if(isset($_POST['ajax']) && $_POST['ajax']==='first') {
$zi_file = intval(date("d", $ar_row1[0])); // Preia ziua inregistrata in fisier
// Daca ziua inregistrata e diferita de cea curenta, o actualizeaza si rescrie si datele din $file_ip
// Actualizeaza elementele de ieri cu cele de azi, iar la cele de azi scrie 1
if($zi_file!==$azi) {
// Sterge datele din $file_ip (cu ip-uri pt. unici azi)
GLOBAL $ip, $file_ip;
file_put_contents($file_ip, $ip);
// Reseteaza datele pt. ieri si azi
$ar_row1[0] = $acum; // Pt. data de azi
$ar_row1[1] = $ar_row1[2]; // Pt. acces_ieri
$ar_row1[2] = 1; // Pt. acces_azi
$ar_row1[3] = $ar_row1[4]; // Pt. unici_ieri
$ar_row1[4] = 1; // Pt. unici_azi
$ar_row1[5] = 1; // Pt. online-acum
$ar_row1[6]++; // Pt. acces_tot
}
else {
$ar_row1[0] = $acum;
$ar_row1[2]++;
$ar_row1[4] = max($unici, $ar_row1[4]);
$ar_row1[6]++;
// Pt. acces_top
if($ar_row1[2]>$ar_row1[7]) {
$ar_row1[7] = $ar_row1[2];
$ar_row1[10] = $acum;
}
// Pt. unici_top
if($ar_row1[4]>$ar_row1[8]) {
$ar_row1[8] = $ar_row1[4];
$ar_row1[11] = $acum;
}
}
}
// Actualizeaza curenti online
$ar_row1[5] = $online;
// Pt. acces_top
if($online>$ar_row1[9]) {
$ar_row1[9] = $online;
$ar_row1[12] = $acum;
}
}
// Creaza variabila cu datele ce trebuie scrise in fisier
$ad_rows[] = implode($sep, $ar_row1);
$ad_rows[] = implode("\r\n", $ar_on);
// Creaza matricea cu datele de iesire ale functiei
$re['start'] = date('j-M-Y', $ar_row1[13]); // Data cand a inceput inregistrarea cu mini-trafic
$re['acum'] = date('j-M-Y, H:i', $ar_row1[0]); // Data si ora curenta
$re['acces_tot'] = $ar_row1[6]; // Total accesari ale site-ului de cand a inceput inregistrarea
$re['acces_top'] = $ar_row1[7];
$re['data_acces_top'] = date('j-M-Y', $ar_row1[10]);
$re['acces_ieri'] = $ar_row1[1];
$re['acces_azi'] = $ar_row1[2];
$re['unici_top'] = $ar_row1[8];
$re['data_unici_top'] = date('j-M-Y', $ar_row1[11]);
$re['unici_ieri'] = $ar_row1[3];
$re['unici_azi'] = $ar_row1[4];
$re['online_top'] = $ar_row1[9];
$re['data_online_top'] = date('j-M-Y, H:i', $ar_row1[12]);
$re['online'] = $ar_row1[5];
// Seteaza o variabila prin care se determina permisiunea de a scrie in $file
if(count($ar_row1)==14 && $ar_row1[13]==$start) $add = 1;
else $add = 0;
// Incearca sa scrie datele in $file, daca nu e accesare de bot si $add=1
if(!$isbot && $add===1) {
if(!file_put_contents($file, implode("\r\n", $ad_rows), LOCK_EX)) $re = array("Nu poate scrie in fisierul $file");
}
return $re;
}
// Daca scriptul e apelat prin $_POST['ajax']='first' si nu exista !isset($_SESSION['minitrafic']), $unici=functia ip_stoc(), Altfel, $unici=1
$unici = (isset($_POST['ajax']) && $_POST['ajax']==='first' && !isset($_SESSION['minitrafic'])) ? ip_stoc($file_ip, $ip) : 1;
// Seteaza un ID al vizitatorului, compus din IP_HTTP-USER_AGENT sau IP-anonym
$id_useron = isset($_SERVER['HTTP_USER_AGENT']) ? $ip.'_'.md5($_SERVER['HTTP_USER_AGENT']) : $ip.'_anonym';
$minitrafic = trafic_on($id_useron, $file_minitrafic); // Apeleaza functia pt. mini-trafic si useri online
/*** Returnarea datelor de iesire (creaza variabila cu datele in cod HTML) ***/
$html = '<div class="tr"><u>Statistici</u> <sup>start: '.$minitrafic['start'].'</sup><br />Data acum: '.$minitrafic['acum'].
'</div>Total accesari site: '.$minitrafic['acces_tot'].'<br /> - Record: '.$minitrafic['acces_top'].' <sup>'.$minitrafic['data_acces_top'].'</sup>
<br /> • Ieri: '.$minitrafic['acces_ieri'].'<br /> • Azi: '.$minitrafic['acces_azi'].'<br />
<div class="tr">- Unici -</div> - Record: '.$minitrafic['unici_top'].' <sup>'.$minitrafic['data_unici_top'].'</sup>
<br /> • Ieri: '.$minitrafic['unici_ieri'].'<br /> • Azi: '.$minitrafic['unici_azi'].'<br />
<div class="tr">- Online -</div> - Record: '.$minitrafic['online_top'].' <sup>'.$minitrafic['data_online_top'].'</sup><br /> • Acum: '.$minitrafic['online'];
echo $html; // Returneaza codul din $html
?>
// Script JS pt. Mini-Trafic Site - de la http://www.marplo.net/php-mysql
// Functia care verifica si creaza obiectul XMLHttpRequest in functie de browser
function get_XmlHttp() {
// Creaza variabila care va contine instanta la XMLHttpRequest, initial cu valoare nula
var xmlHttp = null;
if(window.XMLHttpRequest) { // Daca browser-ul e Forefox, Opera, Safari, ...
xmlHttp = new XMLHttpRequest();
}
else if(window.ActiveXObject) { // Daca browser-ul este Internet Explorer
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlHttp;
}
// Functia care trimite datele la un fisier PHP si returneaza raspunsul
function ajax_send(par) {
var cerere_http = get_XmlHttp(); // Apeleaza functia pt. crearea instantei la obiectul XMLHttpRequest
// Creaza datele care trebuie trimise prin POST la scriptul PHP (perechi nume=valoare)
var datele = 'ajax='+par;
cerere_http.open("POST", 'mini_trafic.php', true); // Creaza cererea
// Adauga un Header specific pentru ca datele sa fie recunoscute ca au fost trimise prin POST
cerere_http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
cerere_http.send(datele); // Efectueaza trimiterea cererii, impreuna cu valorile care trebuie transmise
// Verifica starea cererii
// Daca raspunsul e primit complet
cerere_http.onreadystatechange = function() {
if (cerere_http.readyState == 4) {
// Include raspunsul in tag-ul cu id="trafic" doar daca par=first si nu are deja inclus minim 33 caractere
if(par=='first' && document.getElementById('minitrafic') && document.getElementById('minitrafic').innerHTML.length<33) {
document.getElementById('minitrafic').innerHTML = cerere_http.responseText;
}
}
}
}
ajax_send('first'); // Apeleaza functia ajax_send(), ca prima data
// Auto-apeleaza functia ajax_send() la interval de 40 secunde
setInterval("ajax_send('repeat')", 40000);
Ca sa protejati directorul in care sunt create fisierele text cu datele traficului (aici "minitrafic") creati in interiorul lui un fisier .htaccess cu urmatorul cod:
# block everyone from accessing this folder
order deny,allow
deny from all