2009-03-24 8 views
3

Ich suche nach einer einfachen (keine Datenbank) Methode, um aufzulisten, wie viele Benutzer auf einer Webseite aktiv sind. Der einfachste Weg, den ich mir vorstellen kann, besteht darin, die Anzahl der offenen Sitzungen zu zählen.Anzahl der offenen Sitzungen suchen

Dieser Code sollte funktionieren:

$number_of_users = count(scandir(ini_get("session.save_path"))); 

Natürlich wird es nicht wegen der Sicherheitseinschränkungen für das Verzeichnis (wie es sein sollte !!). Kennt jemand eine andere Möglichkeit, auf diese Nummer zuzugreifen, ohne die Verzeichnisberechtigungen zu ändern?

Hinweis: Ich bin auf der Suche nach einer Option, dass nicht beteiligt ist Datenbanken oder die Sicherheit auf PHP-Sitzungen zu reduzieren.

End Hinweis: Für jeden auf diese Frage kommen, landete ich einen Cronjob mit bis (jede Minute ausgeführt wird) von der Wurzel, die etwas Ähnliches tat:

ls /var/lib/php5/ | wc -l > /var/www/sessioncount 

Sicherstellen, dass die /var/www/sessioncount Datei lesbar ist der Apache-Benutzer. Dann können Sie einfach die Datei in PHP lesen:

$number_of_users = file_get_contents("/var/www/sessioncount"); 

Antwort

4

Easy bedeutet in diesem Fall keine Datenbank. Sich auf die Sitzung zu verlassen, um zu sehen, wie viele Benutzer aktiv sind, ist nicht zuverlässig.

Wenn Sie diesen Weg gehen wollten, könnten Sie einen Cronjob machen, der alle paar Minuten von einem sicheren Prozess ausgeführt wird, und diese Zahl in eine Datei oder Datenbank speichern, die PHP liest.

Aber ich empfehle die Datenbank-Route gehen.

+0

Datenbank-Methode ist die langsamste und größte Drosselung für jede Web-Anwendung. Mein Ziel ist es, die Anzahl der Datenbankabfragen auf ein Minimum zu reduzieren. Ich mag die Idee des Cronjobs oder zumindest einen laufenden Prozess. –

0

Sie können nicht von einem PHP-Skript auf dieses Verzeichnis zugreifen, ohne ein Sicherheitsrisiko einzugehen.

Der einfachste Weg zu erreichen, was Sie wollen, ist die Verwendung einer Datenbank. Speichern Sie einfach die IP und den Zeitstempel, und wählen Sie dann anhand des Zeitstempels SELECT aus, um die Anzahl der aktiven Benutzer auf Ihrer Website zu ermitteln.

+0

Ich wollte eine keine Datenbank-Methode. Danke –

5
<? 
// you must set your own accessible session path atop every page. 
session_save_path("/home/some/other/location/"); # SECURITY VIOLATION!!! 
session_start(); 

function session_count() { 
    $filter = "sess_"; 
    $files = scandir(session_save_path()); 
    $count = 0; 
    foreach ($files as $file) { 
    if(strpos($file,$filter)===0) { 
     $count += 1; 
    } 
    } 
    return $count; 
} 

echo session_count(); 
?> 
+1

Okay, das beinhaltet ein großes Sicherheitsrisiko, also nicht die Antwort, nach der ich suche. Trotzdem danke. –

+2

mmm Warum ist das ein Sicherheitsproblem? (oder du meinst in Webroot) – borrel

2

Um dies für jeden anderen zu lösen, hier. Stellen Sie den Code der Reihe nach zusammen und verwenden Sie die Anweisungen auf dem Weg. Benötigt PHPs GD-Erweiterung.

Erstellen Sie ein Verzeichnis in Ihrem Webroot, stellen Sie sicher, dass der Web-Daemon, um es schreiben:

mkdir liveusers 

erstellen ein PHP-Skript (vlive.php zum Beispiel) für die Touch Code (btw. touch ist ein standard * nix-Befehl, benutze das system(), passthru() oder exec(), was immer du möchtest, um es zu benutzen). Habe es Touch eine Datei in diesem Verzeichnis mit einem eindeutigen Dateinamen, zum Beispiel IP + SessionID concat'd zusammen:

<?php 
exec("touch ". $_SERVER['DOCUMENT_ROOT']."/liveusers/". md5($_SERVER['REMOTE_ADDR'].session_id())); /* SECURITY RISK */ 

Jetzt, in der gleichen Datei wir brauchen einen JPEG-Finish es zur Ausgabe aus mit richtige header() 's habe ich ein 1x1 Pixel namens Pixel.jpg in den des Webroot/images/Verzeichnis, etwas anderes zu tun frei fühlen:

$NewImage = imagecreatefromjpeg($_SERVER['DOCUMENT_ROOT']. "/images/pixel.jpg"); 
header("Content-type: image/jpeg"); 
imagejpeg($NewImage); 
?> 

Speicher, um die PHP-Datei, legen Sie dann einen Standard-HTML-Tag in Ihrem Dokument, um es nützlich:

<img src="/vlive.php" alt="Imagination!" /> 

Going pure PHP mit diesem dann Caching-Seiten wird es nur so machen, dass die Live-Benutzer-Dateien kaum jemals erhalten touch 'd. Auf diese Weise können Sie immer noch Live-Benutzer zählen und ein vollständiges Seiten-Cache-System auf Ihrer Website verwenden.

Ok, jetzt berührt jede Seite, die ein Besucher lädt, ihre eindeutige Datei. Wenn sie gerade erst angekommen ist, erstellt der Touch-Befehl eine Datei für diesen Benutzer. Wenn sie auch andere Seiten besucht, wird das Zugriffsdatum bearbeitet mit dem gleichen Touch Befehl.

Dies ist, wo es wird nützlich:

In einem anderen PHP-Skript (sagen wir mal readvlive.php):

<?php 
$livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l"); 
echo "Live Visitors: ". $livenum; 
?> 

Nun wollen wir diesen Code in das HTML-Element enthalten Sie möchten zu sehen, um es in:

<?php include($_SERVER['DOCUMENT_ROOT']. "/readvlive.php"); ?> 

Ok, so jetzt haben wir eine Datei, die es aus der Anzahl der eindeutigen Dateien mit einer Zugriffszeit nur drucken wird geändert vor 10 Minuten. Dies sind unsere Live-Benutzer in den letzten zehn Minuten ...

Jetzt haben wir die Wahl hier, wieder, wenn Sie den vollen Seitencache verwenden, könnten Sie die zwischengespeicherte Live-Nummer in diese Dokumente einfrieren, so dass es eher ärgerlich und nutzlos. Dazu schlage ich PrototypeJS (Google it), verwenden Sie ihre Phantasie AJAX-Tools, legen Sie diesen zwischen <head></head>

<script src="/js/prototype.js" type="text/javascript"></script> 

dann diese über dem Tag </body> platzieren.

<span id="live_users_count">&nbsp;</span> 


<script type="text/javascript"> 
    <!-- 
    Event.observe(window, 'load', function() { 
     if($('live_users_count')) { 
      new Ajax.Updater('live_users_count','/readvlive.php'); 
     } 
    } 
--> 
</script> 

Sollte in Ordnung sein .. nicht zu rau. Wenn Sie daran interessiert sind, wie weit Ihr Verzeichnis diesen Suchbefehl ausführen soll, könnten Sie APC oder etwas zum Zwischenspeichern verwenden. Dieses Beispiel erfordert APC 3.1.4:

<?php 
if(apc_exists('livenum')){ 
    $livenum = apc_fetch('livenum');echo $livenum; 
} else { 
    $livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l"); 
    apc_add('livenum',$livenum,30); 
} 
?> 

APC 3.0.13 und höher:

<?php 
if($livenum = apc_fetch('livenum')){ 
    echo $livenum; 
} else { 
    $livenum = system("find ".$_SERVER['DOCUMENT_ROOT']."/liveusers/ -type f -amin +10 | wc -l"); 
    apc_add('livenum',$livenum,30); 
} 
?> 

Diese werden verwenden APC-Caching für 30 Sekunden, um die letzten 10 Minuten Live-Nutzer zeigt, finden laufen Befehl, um es zweimal pro Minute zu berechnen. Nicht schlecht. : P

reinigen kann bis mit crontab ..

Das Skript (/root/deloverhead erfolgen.sh):

#!/bin/sh 
find "/path/to/liveusers/ -type f -amin +60 -exec rm {} \; 

Crontab Eintrag (jede Stunde):

0 * * * * /root/deloverhead.sh >/dev/null 2>&1 

Viel Spaß, sorry ich erklären könnte, die Dinge seltsam. : P

Verwandte Themen