Une petite proposition : pouvoir afficher la liste des visiteurs actuellement connectés et voir quelle page ils sont éventuellement en train de modifier. L'intérêt n'est pas ultime en soi (il y a la page
DerniersChangements avec horodatage), mais çà peut être sympa à ajouter sur le
TableauDeBordDeCeWiki.
Exemple 1 :
Il y a actuellement
1 utilisateur connecté sur ce site.
Exemple 2 :
Le record de visiteurs simultanés sur
WiKiNi est de
1 visiteur le 03/09/2004 à 23:02.
Exemple 3 :
Il y a
1 utilisateur connecté.
Pour cela rien de plus facile.
1. Dans wakka.php, ajouter tout à la fin la ligne suivante (après l'appel à la méthode Run) - attention, il est important de l'ajouter à la fin et pas au début car on va réutiliser les variables $page et $method :
@require('wakka_connected.inc.php');
2. Uploader dans /actions/ les trois actions suivantes.
actions/nbutilisateursconnectes.php
<?php
$logs_path = 'logs/';
$data_filename = $logs_path . "logs_openconf_connected.log";
if ( file_exists($data_filename) )
{
$users=file("$data_filename");
$nb=count($users);
}
else
$nb=0;
echo 'Il y a actuellement <b>' . $nb . '</b> utilisateur' . ($nb <= 1 ? '' : 's') . ' connecté' . ($nb <= 1 ? '' : 's') . ' sur ce site.' . '<br />';
?>
actions/listeutilisateursconnectes.php
<?php
$logs_path = 'logs/';
$data_filename = $logs_path . "logs_openconf_connected.log";
if ( file_exists($data_filename) )
{
$users=file("$data_filename");
$nb=count($users);
echo $this->Format("Il y a **" . $nb . "** utilisateur" . ($nb <= 1 ? '' : 's') . " connecté" . ($nb <= 1 ? '' : 's') . ". ");
if ( count($users) > 0 )
foreach($users as $user)
{
@list($ip, $name, $zone, $expire) = split('\|', $user);
@list($page, $method) = split('\/', $zone);
if ( !empty($method) && ($method == 'edit' ) )
{
echo $this->Format(" - $name est en train de mettre à jour $page");
}
else
{
echo $this->Format(" - $name visualise $page" . ( empty($method) ? '' : ' (en mode **' . $method . '**)') );
}
}
else
echo '<br />';
}
else
{
echo $this->Format("**Erreur !** Aucune donnée en cours sur les utilisateurs actuellement connectés.");
echo '<br />';
}
?>
actions/maxutilisateursconnectes.php
<?php
$logs_path = 'logs/';
$record = $logs_path . "logs_openconf_record.log";
if ( file_exists($record) )
{
$fp=fopen("$record","r");
while (!feof ($fp))
{ $buffer = fgets($fp, 4096);
list ($nb, $date_tmp)=split('\|',$buffer);
}
fclose ($fp);
}
else
$nb=0;
echo $this->Format('Le record de visiteurs simultanés sur ' . $this->GetConfigValue('wakka_name') . ' est de **' . $nb . '** visiteur' . ($nb <= 1 ? '' : 's') . ' le ' . gmdate("d/m/Y à H:i", $date_tmp) . '.') . '<br />';
?>
3. Créer à la racine (là où se trouve wakka.php) le fichier wakka_connected.inc.php avec le contenu suivant :
<?PHP
$laps = 300;
$logs_path = 'logs/';
$data_filename = $logs_path . "logs_connected.log";
$record = $logs_path . "logs_record.log";
$now=time();
$expire=$now+$laps;
$visitors_connected=0;
// --------------LECTURE DU FICHIER DATA-----------------------
$fichier = array();
if( file_exists($data_filename) )
{
$fp=fopen("$data_filename","r");
$expire_tmp = '';
$ip_tmp = '';
while ( !feof ($fp) )
{
$buffer = fgets($fp, 4096);
@list ($ip_tmp, $name, $user_page, $expire_tmp) = split('\|', $buffer);
if ( ( $ip_tmp != $HTTP_SERVER_VARS['REMOTE_ADDR'] && $expire_tmp > $now ) )
{
$fichier[]="$ip_tmp|$name|$user_page|$expire_tmp";
$visitors_connected++;
}
}
fclose ($fp);
}
// ecriture du fichier data
$fp=@fopen("$data_filename","w");
if (@flock($fp, 2))
{
if ( is_array($fichier) )
{
while (list ($key, $val) = each ($fichier))
{ fputs($fp,$val);
}
}
// On ajoute une ligne : celle du visiteur qui appelle ce script
$visitors_connected++;
$name=$_COOKIE['name'];
if (empty($name)) $name = 'Unknown';
else $name=str_replace('|', '-', $name);
fputs($fp, $HTTP_SERVER_VARS['REMOTE_ADDR'] . "|$name|$page/$method|$expire\n");
}
@flock($fp, 3);
@fclose($fp);
// ----------------LECTURE DU RECORD-----------------------------
$new_record="";
if(file_exists($record))
{ $fp=fopen("$record","r");
while (!feof ($fp))
{ $buffer = fgets($fp, 4096);
list ($visitors_connected_tmp, $date_tmp)=split('\|',$buffer);
if($visitors_connected_tmp<=$visitors_connected){$new_record="$visitors_connected|$now";}
}
fclose ($fp);
}
else
{ // creation du fichier record vide
$fp=fopen("$record","w");
if (flock($fp, 2))
{ fputs($fp,"$visitors_connected|$now");
}
flock($fp, 3);
fclose($fp);
}
// ecriture du fichier record
if($new_record!="")
{ $fp=fopen("$record","w");
if (flock($fp, 2))
{ fputs($fp,"$new_record");
}
flock($fp, 3);
fclose($fp);
}
?>
4. Important ! Créer le répertoire logs à la racine (toujours au même endroit que wakka.php) et
mettez y les droits en écriture (777) si votre serveur le nécessite.
5. Dernière étape (ouf), il ne reste plus qu'à utiliser les 3 actions disponibles, avec :
{{NbUtilisateursConnectes}}
{{ListeUtilisateursConnectes}}
{{MaxUtilisateursConnectes}}
... selon ce que vous voulez afficher à l'écran.
Info. : ce système de comptage via un fichier marche relativement bien tant que, évidemment, il n'y a pas des centaines de visiteurs simultanés (auquel cas le filesystem a généralement du mal à suivre). Pour l'avoir longuement utilisé sur un site totalisant jusqu'à 3000 ou 4000 visiteurs par jour je peux vous dire qu'il fonctionne sans pbs à ce niveau là.