Get page/link traffic σε xml με PHP

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Kung Lao
Δημοσιεύσεις: 4
Εγγραφή: 23 Σεπ 2011 09:13
Επικοινωνία:

Get page/link traffic σε xml με PHP

Δημοσίευση από Kung Lao » 12 Οκτ 2011 06:25

Το έχω γράψει στα αγγλικά στη σελίδα μου και το παραθέτω και εδώ στα ελληνικά για όποιον ενδιαφέρεται. Έχοντας πλήρη στατιστικά μπορεί ο καθένας να κάνει τα κουμαντα του.Να δεί ποιά link υστερούν επισκεψιμότητας, πόσοι ώρα κάθονται οι χρήστες στο καθένα και γενικά, να υπολογίσει bandwidth και φυσικά όπου είναι χρήσιμο να προβλέπει την μελλοντική του επισκεψιμότητα.

Θα χρησιμοποιήσουμε 3 αρχεία και και ενα μικρό κώδικα javascript/ajax που θα ενημερώνει το καταγραφικό script οτι υπάρχει χρήστης και οτι είναι ακόμα online. Δεν χρειαζόμαστε βάση δεδομένων.

Ας ξεκινήσουμε με τον "ρουφιάνο" ο οποίος ενεργοποιείται με το που κάνει load η σελίδα,δηλαδή με το body onload event της javascript. Πρώτα καλείται μια συνάρτηση ρολόι η Timedcount() η οποία αρχικά καθαρίζει το url και κρατάει το όνομα του συγκεκριμένου link λόγου χάρη link1.html και έπειτα το στέλνει στην συναρτηση AjaxStart(url) κάθε 5 δευτερόλεπτα για όσο είναι ανοιχτό το link1 . Η τελευταία καλεί το αρχείο Writexml.php.


Κώδικας: Επιλογή όλων

<head>
<script type="text/javascript">

function AjaxStart&#40;url&#41;
&#123;
if &#40;window.XMLHttpRequest&#41;
  &#123;// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest&#40;&#41;;
  &#125;
else
  &#123;// code for IE6, IE5
  xmlhttp=new ActiveXObject&#40;"Microsoft.XMLHTTP"&#41;;
  &#125;
xmlhttp.open&#40;"GET","Writexml.php?q="+url,true&#41;;
xmlhttp.send&#40;&#41;;
&#125;


function timedCount&#40;url&#41;
&#123;
var url = document.location.href;
url = url.substring&#40;0, &#40;url.indexOf&#40;"#"&#41; == -1&#41; ? url.length &#58; url.indexOf&#40;"#"&#41;&#41;;
url = url.substring&#40;0, &#40;url.indexOf&#40;"?"&#41; == -1&#41; ? url.length &#58; url.indexOf&#40;"?"&#41;&#41;;
url = url.substring&#40;url.lastIndexOf&#40;"/"&#41; + 1, url.length&#41;;
t=setTimeout&#40;"timedCount&#40;&#41;",5000&#41;;
AjaxStart&#40;url&#41;;
&#125; 
</script>
</head>
<body onLoad="timedCount&#40;&#41;;">
Πάμε τώρα να δημιούργησουμε και να αναλύσουμε το Writexml.php.
Αυτό ανοίγει το αρχείο results.xml αρχικά να του ρίξει μια ματιά και έπειτα το τροποποιεί.
Αρχικά ξεκινά ένα session για να ξέρουμε την ip του χρήστη και να αποφύγουμε διπλοεγγραφές στις επισκέψεις και έπειτα λαμβάνει με GET το όνομα του link που το κάλεσε. Στους ελέγχους παράκάτω έχουμε δυο σημαντικές μεταβλητές οι οποίες πάνε πακέτο,ζευγάρι την $currenturl και την $currentdate!!!
Θα επεξεργαστούμε τις xml ετικέτες με τις DOM μεθόδους τις php. Ολα τα xml δεδομένα θα αποθηκευτούν σε arrays. Ωρα για κώδικα...

Writexml.php:

Κώδικας: Επιλογή όλων

session_start&#40;&#41;;
$currenturl=$_GET&#91;'q'&#93;;

/*Ενα validation το στύλ if&#40;$currenturl=='link1.html' || $currenturl=='link2.html'&#41;&#123; do code...&#125;   δεν θα έβλαπτε καθόλου..
*/

$doc = new DOMDocument&#40;&#41;; 
$doc->load&#40; 'Results.xml', LIBXML_NOBLANKS &#41;;
$doc->formatOutput = true;


$currentdate= date&#40;"j.m.Y"&#41;;
//Εδω κρατάμε την τωρινή ημερομηνία βάση server.

$root = $doc->documentElement;

$visitors = $doc->getElementsByTagName&#40; "day" &#41;;
 
$existingdates = array&#40;&#41;;
$existurl = array&#40;&#41;;


foreach&#40; $visitors as $day &#41; 
&#123; 
  $dates = $day->getElementsByTagName&#40;"date"&#41;; 
  $date = $dates->item&#40;0&#41;->nodeValue;

  $existingdates&#91;&#93;=$date;

  $urls = $day->getElementsByTagName&#40;"url"&#41;; 
  $url = $urls->item&#40;0&#41;->nodeValue;

  $existurl&#91;&#93;=$url;

&#125;

/*Σε αυτή τη loop απλά βάζουμε όλα τα url και τις ημερομηνίες που υπάρχουν στο xml σε arrays.*/

/*Παρακάτω δημιουργούμε μια συνάρτηση findit&#40;&#41; η οποία θα ελέγξει αν το ζευγάρι $currentdate-$currenturl υπάρχει κάπου στο Results.xml*/

function findit&#40;$ul,$dat,$existingdates,$existurl&#41;&#123;
for&#40;$j=0;$j<count&#40;$existingdates&#41;;$j++&#41;&#123;
if&#40;$existurl&#91;$j&#93;==$ul && $existingdates&#91;$j&#93;==$dat&#41;&#123;
  return true;&#125;  
&#125;
&#125;


foreach&#40; $visitors as $day &#41; 
&#123; 
//Μέσα σε αυτόν τον στρόβιλο ξεκινάμε το scan των δεδομένων του Results.xml

  $dates = $day->getElementsByTagName&#40;"date"&#41;; 
  $date = $dates->item&#40;0&#41;->nodeValue;


  $urls = $day->getElementsByTagName&#40;"url"&#41;; 
  $url = $urls->item&#40;0&#41;->nodeValue;

  
  $durations = $day->getElementsByTagName&#40;"duration"&#41;; 
  $duration = $durations->item&#40;0&#41;->nodeValue;
  
  
  $visitnumbers = $day->getElementsByTagName&#40;"visitnumber"&#41;; 
  $visitnumber = $visitnumbers->item&#40;0&#41;->nodeValue;

/*Αυτή η συνθήκη if είναι λιγάκι κρίσιμη. Ελέγχουμε αν το ζευγαράκι $currentdate και $currenturl υπάρχει αυτούσιο στο xml. Αν ένα απο τα δύο δεν ταιριάζει ξεκινάμε νέα καταγραφή είτε επειδή κάποιο νέο url κλήθηκε είτε επείδη για σήμερα είναι η πρώτη κλήση.
Μέσα στη συνθήκη καλούμε και την συνάρτηση findit που δημιουργήσαμε παραπάνω.
*/

if&#40;&#40;$currentdate!==$date && $currenturl==$url && &#40;!in_array&#40;$currentdate,$existingdates,true&#41;&#41;&#41;
|| &#40;$currentdate==$date && $currenturl!==$url && !findit&#40;$currenturl,$currentdate,$existingdates,$existurl&#41;        &#41;
&#41;&#123;



/*Ξεκινάμε νέα καταγραφή και ενσωματώνουμε τα νέα δεδομένα ως "παιδιά-childs" της ετικέτας day και την νέα ετικέτα day ως "παιδί" της βασικής ετικέτας visitors*/

  $b = $doc->createElement&#40; "day" &#41;;
  $main = $doc->getElementsByTagName&#40; "visitors" &#41;;
  $main = $doc->appendChild&#40;$b&#41;;
 
  $date = $doc->createElement&#40; "date" &#41;; 
  $date->appendChild&#40; 
  $doc->createTextNode&#40; $currentdate&#41; &#41;; 
  $b->appendChild&#40; $date &#41;;

  $url = $doc->createElement&#40; "url" &#41;; 
  $url->appendChild&#40; 
  $doc->createTextNode&#40; $currenturl&#41; &#41;; 
  $b->appendChild&#40;$url&#41;;


  $duration = $doc->createElement&#40; "duration" &#41;; 
  $duration->appendChild&#40; 
  $doc->createTextNode&#40; '0'&#41; &#41;; 
  $b->appendChild&#40; $duration &#41;;

  $visitnumber = $doc->createElement&#40; "visitnumber" &#41;; 
  $visitnumber->appendChild&#40; 
  $doc->createTextNode&#40; '1' &#41; &#41;; 
  $b->appendChild&#40; $visitnumber &#41;;

/*Αφού τα βάλουμε όλα μέσα στο tag visitors κάνουμε save το αρχείο*/
   $root->appendChild&#40;$b&#41;;
   $doc->save&#40;"Results.xml"&#41;;

&#125;
else if&#40;$currentdate==$date && $currenturl==$url&#41;&#123;

/*Αν τώρα το ζευγάρι υπάρχει ήδη μέσα, δεν το ξαναγράφουμε,απλά ανανεώνουμε τους μετρητές μας.Αν είναι η πρώτη κλήση απο την συγκεκριμένη ip προσθέτουμε +1 στo visitnumber. Επίσης είτε είναι η ίδια ip είτε καινούργια προσθέτουμε +5 δευτερόλεπτα στο $duration
*/

$timing = &#40;$duration = $durations->item&#40;0&#41;->nodeValue&#41; -&#40;-5&#41;;

$duration = $durations->item&#40;0&#41;->nodeValue=$timing;

if&#40;!isset&#40;$_SESSION&#91;'ip'&#93;&#41; &#41;&#123;$_SESSION&#91;'ip'&#93; = $_SERVER&#91;'REMOTE_ADDR'&#93;;

$addnewvisit = &#40;$visitnumber = $visitnumbers->item&#40;0&#41;->nodeValue&#41; -&#40;-1&#41;;

$visitnumber = $visitnumbers->item&#40;0&#41;->nodeValue=$addnewvisit;

&#125;
 
 $doc->save&#40;"Results.xml"&#41;;
/*Και ξανασώζουμε το αρχείο*/
&#125;
&#125;
Πάμε τώρα να κάνουμε ανάκληση των δεδομένων και να τα παρουσιάσουμε κάπως βολικά στο μάτι. Στο css μας θα χρησιμοποιήσουμε class. Οι ημερομηνίες θα μπούν πάνω πάνω οριζόντια και θα τις γράψουμε μόνο μία φορά. Απο κάτω απο την κάθε ημερομηνία κάθετα θα παρουσιάζονται το κάθε link και ο αριθμός των επισκέψεων του καθώς και η συνολική online παραμονή σε αυτό. Θα ξαναβάλουμε τα δεδομένα σε λούπα για να "πετύχουμε" το css. Η κύρια κάθετη κλάσση είναι η set και κάθε μια ημερομηνία μπαίνει σε μία τέτοια ξεχωριστή κλάσση.

ShowResults.php:

Κώδικας: Επιλογή όλων

<head>
<style type="text/css">
.set&#123;
width&#58;auto;
height&#58;auto;
float&#58;left;
&#125;
.dates&#123;width&#58;100px;height&#58;20px;background-color&#58;#001232;color&#58;#fff135&#125;
.url&#123;width&#58;100px;height&#58;20px;text-decoration&#58;underline;&#125;
.duration&#123;width&#58;100px;height&#58;20px;&#125;
.visit&#123;width&#58;100px;height&#58;20px;&#125;
</style>
</head>
<body>

<?php
$doc = new DOMDocument&#40;&#41;; 
$doc->load&#40; 'Results.xml', LIBXML_NOBLANKS &#41;;
$doc->formatOutput = true;

$root = $doc->documentElement;
$visitors = $doc->getElementsByTagName&#40; "day" &#41;;

$existingdates = array&#40;&#41;;

$urlarray = array&#40;&#41;;

$durationarray = array&#40;&#41;;

$visitnumberarray = array&#40;&#41;;

foreach&#40; $visitors as $day &#41; 
&#123; 
  $dates = $day->getElementsByTagName&#40;"date"&#41;; 
  $date = $dates->item&#40;0&#41;->nodeValue;

  $existingdates&#91;&#93;=$date;

  $urls = $day->getElementsByTagName&#40;"url"&#41;; 
  $url = $urls->item&#40;0&#41;->nodeValue;
 
  $urlarray&#91;&#93;=$url;
  
  $durations = $day->getElementsByTagName&#40;"duration"&#41;; 
  $duration = $durations->item&#40;0&#41;->nodeValue;

  $durationarray&#91;&#93;=$duration;
  
  $visitnumbers = $day->getElementsByTagName&#40;"visitnumber"&#41;; 
  $visitnumber = $visitnumbers->item&#40;0&#41;->nodeValue;
  
  $visitnumberarray&#91;&#93; = $visitnumber;
&#125;
/*Απλά βάλαμε τα δεδομένα σε νέες arrays*/

$showndates = array&#40;&#41;;

for&#40;$i=0;$i<count&#40;$existingdates&#41;;$i++&#41;&#123;

/* Παρακάτω είναι ο στύλος του css. Ελέγχουμε αν η ημερομηνία έχει ήδη εκτυπώθει.
Αν δεν έχει εκτυπωθεί και αν δεν είμαστε στην πρώτη εγγραφή, πρώτα κλείνουμε την προηγούμενη ανοιχτή κλάσση ,ξεκινάμε καινουργια κλάσση και μετά την εκτυπώνουμε μέσα*/

if&#40;!in_array&#40;$existingdates&#91;$i&#93;,$showndates&#41; &#41;&#123;  if&#40;$i!==0&#41;&#123;echo "</div>";&#125;
echo "<div class=\"set\">";

$showndates&#91;&#93;=$existingdates&#91;$i&#93;;

echo "<div class=\"dates\">";
echo $existingdates&#91;$i&#93;;
echo "</div>";                               
                                               
echo "<div class=\"url\">";
echo $urlarray&#91;$i&#93;;
echo "</div>";
                
echo "<div class=\"duration\">";
//echo $durationarray&#91;$i&#93;;
echo gmdate&#40;"H&#58;i&#58;s", $durationarray&#91;$i&#93;&#41;;
echo "</div>";

echo "<div class=\"visit\">";
echo $visitnumberarray&#91;$i&#93;;
echo "</div>";
if&#40;$i==count&#40;$existingdates&#41;-1&#41;&#123;  echo "</div>"; &#125;
//Ελέγχουμε αν είμαστε στην τελευταία εγγραφή ώστε να κέίσουμε την ανοιχτή κλάσση
                                             &#125;
else &#123;  

echo "<div class=\"url\">";
echo $urlarray&#91;$i&#93;;
echo "</div>";
                
echo "<div class=\"duration\">";
echo gmdate&#40;"H&#58;i&#58;s", $durationarray&#91;$i&#93;&#41;;
//echo $durationarray&#91;$i&#93;;
echo "</div>";

echo "<div class=\"visit\">";
echo $visitnumberarray&#91;$i&#93;;
echo "</div>";

if&#40;$i==count&#40;$existingdates&#41;-1&#41;&#123; echo "</div>";  &#125;
                                                
       &#125;
                                             &#125;
?>

</body>
Τέλος το αρχείο Results.xml
Μέσα σε αυτό γράψτε manual την σημερινή ήμερομήνια,ένα link και 0 και 0 στο visitnumber και duration

Κώδικας: Επιλογή όλων

<?xml version="1.0" encoding="ISO-8859-1"?>
<visitors>  
<day>    
  <date>12.10.2011</date>   
  <url>ajaxx.html</url>   
  <duration>0</duration>   
  <visitnumber>0</visitnumber> 
 </day>
</visitors>


www.cssalien.com

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης