Curs PHP-MySQL


Script Mini-Trafic site

Download - Nr. descarcari - 481          


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).


Ca sa vedeti direct cum functioneaza, ce va afisa, click pe ->

Foloseste doua fisiere principale: mini_trafic.php si mini_trafic.js si un director "minitrafic" in care sunt stocate fisierele .txt cu datele accesarilor (mai jos gasiti codul fiecaruia).
Cele 2 fisiere .txt pentru stocarea datelor sunt: "ipuri.txt" si "minitrafic.txt". In primul sunt stocate ip-urile tuturor vizitatorilor din ziua curenta, iar in celalalt sunt salvate pe primul rand datele minitrafic-ului, iar de la al doilea rand sunt adaugati utilizatorii online.

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.


In codul scriptului gasiti explicatii detaliate la fiecare functie, ca sa puteti invata si modifica usor daca sunteti interesati de programarea PHP - JavaScript.

- Mod de implementare

- Dupa ce creati pe server fisierele "mini_trafic.js" si "mini_trafic.php" (in locul unde sunt fisierele site-ului dv. in care veti folosi acest script), cu codul pe care-l gasiti mai jos pt. fiecare, creati si directorul "minitrafic", cu permisiuni de scriere CHMOD 0777.
- In pagina dv, unde doriti sa includeti acest script, in locul unde vreti sa apara traficul afisat, adaugati urmatorul cod:
<div id="minitrafic"> </div>
<!-- Script Mini-Trafic, de la http://www.marplo.net -->
<script src="mini_trafic.js" type="text/javascript"></script>

Cod - mini_trafic.php

<?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 /> &nbsp; - Record: '.$minitrafic['acces_top'].' <sup>'.$minitrafic['data_acces_top'].'</sup>
  <br /> &nbsp; &nbsp; &bull;&nbsp; Ieri: '.$minitrafic['acces_ieri'].'<br /> &nbsp; &nbsp; &bull;&nbsp; Azi: '.$minitrafic['acces_azi'].'<br />
<div class="tr">- Unici -</div> &nbsp; - Record: '.$minitrafic['unici_top'].' <sup>'.$minitrafic['data_unici_top'].'</sup>
<br /> &nbsp; &nbsp; &bull;&nbsp; Ieri: '.$minitrafic['unici_ieri'].'<br /> &nbsp; &nbsp; &bull;&nbsp; Azi: '.$minitrafic['unici_azi'].'<br />
  <div class="tr">- Online -</div> &nbsp; - Record: '.$minitrafic['online_top'].' <sup>'.$minitrafic['data_online_top'].'</sup><br /> &nbsp; &bull;&nbsp; Acum: '.$minitrafic['online'];

echo $html;                // Returneaza codul din $html
?>

Cod - mini_trafic.js

// 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


- Scriptul este gratuit, il puteti modifica si folosi dupa cum doriti. Fiind gratuit, nu se ofera suport, dar daca aveti sesizari, opinii sau intrebari legate de el, va rog sa postati pe Forum la sectiunea PHP - JavaScript - Ajax.

Lectii / Tutoriale

Diverse PHP

Scripturi

  • PHP Script Chat
  • CMS Blog cu Ajax
  • Script Upload
  • Uploader
  • Multi-Uploader
  • Contoar pagina
  • Contor 2
  • Contoar click-uri
  • Contor Downloads
  • Numar Vizitatori si Utilizatori Online
  • Script inregistrare
  • Inregistrare Utilizatori
  • Curs valutar
  • Curs valutar 2
  • Mailer
  • Formular contact
  • Script comentarii
  • Script comentarii 2
  • Script comentarii 3
  • Vizitatori online
  • Script Paginare
  • Clasa Paginare
  • Script Page Rank
  • Script Chat
  • Numarare cuvinte
  • Recomanda pagina
  • Sistem notare
  • Countdown timer
  • Mini_Trafic Site
  • Subiecte forum
  • Clasa cautare Google
Script Mini-Trafic site
2008 - 2012 Webmaster, Webdesigner : MarPlo