Wikini

VoirLaListeDesVisiteursActuellementConnectes

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-44-220-251-236.compute-1.amazonaws.com
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 <= '' 's') . ' connecté' . ($nb <= '' '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 <= '' 's')  . " connecté" . ($nb <= '' 's') . ". ");
  if ( 
count($users) > )
    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($fp4096);
    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 <= '' '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($fp4096);
    @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($fp2))

  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($fp3);
@
fclose($fp);

// ----------------LECTURE DU RECORD-----------------------------
$new_record="";
if(
file_exists($record))
$fp=fopen("$record","r");
  while (!
feof ($fp))
  { 
$buffer fgets($fp4096);
    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($fp2))
  { 
fputs($fp,"$visitors_connected|$now");
  }
  
flock($fp3);
  
fclose($fp);
}

// ecriture du fichier record
if($new_record!="")
$fp=fopen("$record","w");
  if (
flock($fp2))
  { 
fputs($fp,"$new_record");
  }
  
flock($fp3);
  
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à.
Commentaires [Cacher commentaires/formulaire]