Χρονομέτρηση επίσκεψης σε site

Μια περιοχή όπου τα μέλη μας μπορούν να βάζουν τα PHP scripts που έχουν φτιάξει και θέλουν να τα μοιραστούν με τα υπόλοιπα μέλη.

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

Απάντηση
Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Χρονομέτρηση επίσκεψης σε site

Δημοσίευση από korgr » 08 Φεβ 2011 22:48

Στα πλαίσια ενός νέου widget (Timer Android style) που ενσωματώσαμε στο Odyssey, χρειάστηκε να δημιουργηθεί μια class που να χρονομετρά την συνολική χρονική διάρκεια που παραμένει ένας επισκέπτης στο site.

Σ' αυτές τις περιπτώσεις είναι επόμενο να καταλήξεις σε ένα συμβιβασμό αφού είναι γνωστό πως εύκολα καταγράφεις την είσοδο κάποιου σε ένα site αλλά δεν υπάρχει ασφαλής μέθοδος για την έξοδο.

Καταλήξαμε στην χρονομέτρηση του session με ένα εξ ορισμού ανώτερο timeout στα 30 λεπτά. Από σελίδα σε σελίδα γίνεται reset το συγκεκριμένο timeout με αποτέλεσμα να λήξει οριστικά η χρονομέτρηση για οποιονδήποτε χρήστη μείνει ανενεργός στο site μας (δεν επισκεφθεί κάποιο άλλο εσωτερικό μας link) επί 30 συνεχόμενα λεπτά. Από την άλλη θεωρήσαμε λογικό να εντάξουμε στην ίδια χρονομέτρηση όσες επισκέψεις γίνουν στο site στο τρέχον session, ακόμα και αν μεσολαβούν ανάμεσά τους επισκέψεις σε άλλα sites και επιστροφές στο δικό μας (αρκεί να είναι μέσα στα όρια των 30 λεπτών).

Η class (timer.php):

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

<?php 
class timer&#123;
	var $now;
	var $sessionSeconds;
	
	function __construct&#40;$sessionSeconds=1800&#41; &#123;
		//  εξ ορισμού για κάθε 30 λεπτά &#40;1800 δευτερόλεπτα&#41; που δεν υπάρχει activity να ορίζεται νέος χρονομέτρης
		$this->now = @time&#40;&#41;;
		$this->sessionSeconds = $sessionSeconds;
		$lastActivity = $_SESSION&#91;'lastActivity'&#93;;
		if&#40;&#40;$this->now - $lastActivity > $this->sessionSeconds&#41; || &#40;$this->now - $lastActivity == 0&#41;&#41;&#123;
			$this->setNewTimer&#40;&#41;;
		&#125;else&#123;
			$_SESSION&#91;'lastActivity'&#93; = $this->now;
		&#125;
	&#125;
	
	function setNewTimer&#40;&#41;&#123;
		$_SESSION&#91;'firstActivity'&#93; = $this->now;
		$_SESSION&#91;'lastActivity'&#93; = $this->now;
	&#125;
	
	function getUserTime&#40;&#41;&#123;
		$firstActivity = $_SESSION&#91;'firstActivity'&#93;;
		$startFromSeconds = $this->now - $firstActivity;
		return $startFromSeconds;
	&#125;


&#125; // end class
?>
Όπως βλέπετε μπορεί να παρακαμφθεί το όριο των 30 λεπτών (1800 δευτερόλεπτα) περνώντας στην κλάση ως όρισμα τα δευτερόλεπτα που επιθυμούμε να γίνεται το αυτόματο timeout.

Την χρησιμοποιούμε ως εξής:

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

<?php
include&#40;"timer.php"&#41;; // το class file
$timer = new timer&#40;$seconds&#41;;
Αν δεν ορίσουμε την $seconds τότε θα έχουμε το default timeout των 30 λεπτών
Στην περίπτωση αυτή μπορούμε να δημιουργήσουμε ένα νέο χρονομέτρη απλά με

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

$timer = new timer&#40;&#41;;
Αφού ορίσουμε τον χρονομέτρη, μπορούμε ανά πάσα στιγμή να γνωρίζουμε την διάρκεια επίσκεψης σε δευτερόλεπτα με

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

$seconds = $timer->getUserTime&#40;&#41;;
Απαραίτητη προϋπόθεση για την σωστή λειτουργία, είναι να έχει προηγηθεί στον κώδικα σας η έναρξη του session με session_start() πριν δημιουργήσουμε ένα χρονομέτρη.

Εμείς για τις ανάγκες της εμφάνισης του χρόνου δημιουργήσαμε ένα flash widget αλλά ο καθένας μπορεί να εκμεταλευτεί όπως επιθυμεί την τιμή που επιστρέφεται και να την εμφανίσει όπως επιθυμεί.

Demo

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Χρονομέτρηση επίσκεψης σε site

Δημοσίευση από dva_dev » 08 Φεβ 2011 23:02

Οπως λες κι εσύ είναι σχεδόν αδύνατο να πιάσεις το φέυγα από τη σελίδα σου, όμως θα μπορούσες να κάνεις μια προσπάθεια με το onunload event.

papoukas
Δημοσιεύσεις: 76
Εγγραφή: 18 Ιαν 2011 23:24

Χρονομέτρηση επίσκεψης σε site

Δημοσίευση από papoukas » 08 Φεβ 2011 23:58

To unload event δεν παίζει σε όλους τους browser. Γιατί δεν το κάνεις με javascript και interval (το αντίστοιχο του timer se php). Κάθε φορά που θα ανανεώνεται μπορείς να στέλνεις με ajax το userid και να ενημερώνει την βάση με νέο timestamp. Έτσι θα έχεις τον min(χρόνο παραμονής) με σφάλμα το interval

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Χρονομέτρηση επίσκεψης σε site

Δημοσίευση από dva_dev » 09 Φεβ 2011 00:44

Το unload έχει περιορισμούς, όπως έχει και η javascript, αλλά άμα σου κάτσει και παίξει κερδίζεις κάτι χωρίς να ζαλίζεις το server με συνεχείς ερωτήσεις-ενημερώσεις.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Χρονομέτρηση επίσκεψης σε site

Δημοσίευση από korgr » 09 Φεβ 2011 09:13

Είναι πολύ απλό και το εξήγησα.
Αν κάποιος φύγει από το site και επιστρέψει πχ μετά από μικρό χρονικό διάστημα, θέλω να λογίζεται μέρος της ίδιας επίσκεψης!
Εκτός αυτού θέλω να στηριχθώ μόνο σε server side μεθόδους.

ΥΓ To unload event αφορά την αποχώρηση από σελίδα και όχι από το site έτσι δεν είναι?

Skywalker
Δημοσιεύσεις: 31
Εγγραφή: 20 Μάιος 2008 17:33

Χρονομέτρηση επίσκεψης σε site

Δημοσίευση από Skywalker » 20 Μάιος 2011 15:00

Εγώ στο site μου έχω βάλει ένα interval ανά 30 δευτερόλεπτα κι έτσι μπορώ να βλέπω με μέγιστη απώλεια 30 δευτ. πόσο έχει μείνει μέσα κάποιος. Αυτό το interval λέτε να βαραίνει τον server? Δεν είχε ποτέ πρόβλημα έως τώρα. Το χρησιμοποιώ εδώ και κάτι μήνες.

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Χρονομέτρηση επίσκεψης σε site

Δημοσίευση από Rapid-eraser » 27 Μάιος 2011 20:32

Με χρήση apache η τεχνική του Skywalker με 30 - 40 χρήστες μπορεί να κάνει πολύ εύκολα exhaust τα resources κάποιου account (shared), όσον αφορά την χρήση του concurrency.

Να θυμίσω ότι ήταν και ο λόγος που ξηλώθηκε το chat από το FS.
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

Απάντηση

Επιστροφή στο “PHP τα δικά μας scripts”

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

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