Un chti bout de php siou plé

  • Auteur de la discussion Auteur de la discussion Zecat
  • Date de début Date de début
WRInaute accro
Hello les php codeurs,

Juste un petit blème tout simple (mais vu mon niveau en php, ca devient une montagne). Voila, j'ai un petit script "compteur.php" qui me compte le nombre de connectés sur un site en utilisant un petit fichier "compteur.txt".


Code:
<?php
function isBots()
{	
	$bots=array('72.14.192'=>1, '72.14.192'=>1, '66.249.72'=>1, '66.249.66'=>1, '66.249.65'=>1,
	'64.233.173'=>1, '216.239.58'=>1, '65.55.246'=>1, '65.55.235'=>1, '65.54.188'=>1, '64.4.8'=>1,
	'207.68.157'=>1, '207.68.146'=>1, '207.46.98'=>1, '207.46.98'=>1, '72.30.99'=>1, '72.30.98'=>1,
	'72.30.97'=>1, '72.30.61'=>1, '72.30.252'=>1, '72.30.226'=>1, '72.30.221'=>1, '72.30.216'=>1,
	'72.30.215'=>1, '72.30.214'=>1, '72.30.177'=>1, '72.30.135'=>1, '72.30.134'=>1, '72.30.133'=>1,
	'72.30.132'=>1, '72.30.131'=>1, '72.30.129'=>1, '72.30.128'=>1, '72.30.111'=>1, '72.30.110'=>1,
	'72.30.107'=>1, '72.30.104'=>1, '72.30.103'=>1, '72.30.102'=>1, '72.30.101'=>1, '68.142.251'=>1,
	'68.142.250'=>1, '68.142.249'=>1, '68.142.212'=>1, '66.94.238'=>1, '66.94.237'=>1, '66.94.232'=>1,
	'66.196.91'=>1, '66.196.65'=>1, '213.251.136'=>1, '194.3.104'=>1, '190.57.10'=>1, '140.94.82'=>1,
	'193.252.148'=>1, '193.252.118'=>1, '64.233.182'=>1);
	
	$shortip = explode(".",$_SERVER['REMOTE_ADDR']);
	array_pop($shortip);
	$shortip = implode(".",$shortip);
	if (isset($bots[$shortip])) return true;
	return false;
}

if (!file_exists($_SERVER['DOCUMENT_ROOT']."/".$dossier_compteur."/compteur.txt")) $compteur_live = array();
else $compteur_live = file($_SERVER['DOCUMENT_ROOT']."/".$dossier_compteur."/compteur.txt");
$premiere_ligne_a_garder=-2;
do $premiere_ligne_a_garder=$premiere_ligne_a_garder+2;
while((date('U', strtotime('-300 seconds')) > $compteur_live[$premiere_ligne_a_garder]) && ($premiere_ligne_a_garder < count($compteur_live)));
if(isset($_SERVER["REMOTE_ADDR"])) $ip_en_cours = $_SERVER["REMOTE_ADDR"];
else $ip_en_cours = "Non identifiable";

$compteur = "";
$onlinecount = 0;
if($premiere_ligne_a_garder < count($compteur_live)) 
{
	for($i=$premiere_ligne_a_garder; $i<count($compteur_live); $i=$i+2) 
	{
		if(trim($compteur_live[$i+1]) != $ip_en_cours)
		{
			$compteur .= trim($compteur_live[$i])."\n".trim($compteur_live[$i+1])."\n";
			$onlinecount++;
		}
	}
}

if (!isBots())
{
	$compteur .= date('U')."\n".$ip_en_cours;
	$onlinecount++;
}
$pointeur=fopen($_SERVER['DOCUMENT_ROOT']."/".$dossier_compteur."/compteur.txt","w");
fputs($pointeur,$compteur);
fclose($pointeur);

echo $onlinecount;
?>



A la sortie j'ai la variable $onlinecount qui contient le nombre et je l'affiche ou je veux.

J'aimerais ajouter les quelques lignes qui vont faire cela :

Code:
1 - ouvrir un fichier "record.txt" (on part du principe qu'il existe)
2 - lire son contenu (un nombre sur la premiere ligne, une date sur la seconde ligne, une heure sur la troisieme ligne)
3 - ranger les infos dans $onlinerecord; $daterecord; $heurerecord

si($onlinecount > onlinerecord)
- mettre a jour records.txt avec nombre, date et heure
- ranger les nouvelles infos dans $onlinerecord; $daterecord; $heurerecord
fin de si

Voila c'est tout bébête (à la sortie je peux utiliser mes 3 variables dans tous les cas (record battu ou pas). Pour me simplifier la lecture, ca serait bien de rajouter ca à la fin du script actuel et pas de le noyer au millieu. ki ki peut me faire ca sur un coin de table ? :wink:
 
WRInaute impliqué
Un truc comme ça (y a peut-être un coquille, j'ai pas testé) ?

Code:
$online_count = '500000'; // on peut rêver

$filename = 'records.txt';

// ouvre le fichier et récupère les infos
$filecontent = file_get_contents($filename);
list($onlinerecord, $daterecord, $heurerecord) = explode("\n", $filecontent);

if( $onlinecount>$onlinerecord )
{
  // on met à jour le fichier
  $new_content = $onlinecount ."\n" .date('Y-m-d') ."\n". date('H:i');
  file_put_contents($filename, $new_content);
}
 
WRInaute accro
ca coince sur cette ligne :

Code:
$filecontent = file_get_contents($filename);

avec ce message :

Code:
Warning: file_get_contents(records.txt) [function.file-get-contents]: failed to open stream: No such file or directory in /vhosts/a/z/azsante/www/compteur/compteur.php on line 61

puis sur
Code:
 file_put_contents($filename, $new_content);

Code:
Fatal error: Call to undefined function: file_put_contents() in /vhosts/a/z/azsante/www/compteur/compteur.php on line 68
 
WRInaute accro
Peut etre dois je mettre :

Code:
$_SERVER['DOCUMENT_ROOT']."/".$dossier_compteur."/records.txt"

comme c'est le cas dans le script actuel :?:

Bon je test. Ben non. si je fais ca j'ai :

Fatal error: Call to undefined function: file_put_contents() in /vhosts/a/z/azsante/www/compteur/compteur.php on line 68
 
WRInaute impliqué
oui, tu dois mettre le bon chemin vers le fichier (et le créer si nécessaire).

pour l'erreur file_put_contents(), je viens de voir que c'est dispo à partir de php5.
Si tu n'as pas la possibilité de passer en php5, tu peux "créer" la fonction file_put_contents() comme expliqué là :
http://fr.php.net/manual/fr/function.file-put-contents.php#86864

Code:
if (!function_exists('file_put_contents')) {
    function file_put_contents($filename, $data) {
        $f = @fopen($filename, 'w');
        if (!$f) {
            return false;
        } else {
            $bytes = fwrite($f, $data);
            fclose($f);
            return $bytes;
        }
    }
}
 
WRInaute accro
oh "pitin", je suis aussi bon en anglais qu'en php :mrgreen: My tailor is rich ans my sister is not a boy et là je suis a fond :mrgreen:

on peut pas mettre le bon code direct dans le script sans faire de fonctions :?:
 
WRInaute impliqué
Zecat a dit:
on peut pas mettre le bon code direct dans le script sans faire de fonctions :?:
Si, ca deviendrait un truc comme ça :
Code:
$online_count = '500000'; // on peut rêver

$filename = $_SERVER['DOCUMENT_ROOT'].'/'.$dossier_compteur.'/records.txt';

// ouvre le fichier et récupère les infos
$filecontent = file_get_contents($filename);
list($onlinerecord, $daterecord, $heurerecord) = explode("\n", $filecontent);

if( $onlinecount>$onlinerecord )
{
  // on met à jour le fichier
  $new_content = $onlinecount ."\n" .date('Y-m-d') ."\n". date('H:i');

  $f = @fopen($filename, 'w');
  fwrite($f, new_content);
  fclose($f);
}
 
WRInaute accro
oki je retestouille

Ca marche.

J'ai juste viré un @ en trop (fopen) et ajouté un $ qui manquait (new_content).

Merci à toi
 
WRInaute accro
voila c'est en place :

-http://www.az-sante.com/

en bas de page.

Grand merci à toi, à charge de revanche (bon pas pour t'aider en php c'est sur mais p'têt pour aller valider express dans Yag :wink: )
 
WRInaute accro
Juste une petite question par pure curiosité intellectuelle. la meme chose mais dans une base mysql :
- accès à la base
- lecture enregistrement
- mise à jour
- reécriture enregistrement

en terme de :

- vitesse
- consommation ressources sur le serveur

par rapport à la démarche "petit fichier.txt", ca donne quoi ? quif quif, 10 fois plus pour l'un ? Juste pour savoir si je vais pas écrouler mon mutu :wink:
 
WRInaute accro
ou un forum d'entraide ... entre ceux :wink: qui savent et ceux qui ne savent pas ... :wink:

D'ailleurs ce forum "developpement de site web" me semble tout à fait adapté à cela entre autres non ? Et je préfère demander ici ou je connais du monde que sur un forum lamda sur php ou je connais personne.
 
WRInaute accro
Je continue (laborieusement) mon apprentissage php ...

Et la je m'arrache les tiff depuis une heure :

Voila la bout de code en question :

<?

Code:
global $nb_vues_par_page;

$fpagesunique = fopen ($_SERVER['DOCUMENT_ROOT']."/".STATPAGES."/".$mot.".txt", "w+");  
$nb_vues_par_page = fgets ($fpagesunique, 11);  
$nb_vues_par_page = $nb_vues_par_page + 1;  
fseek ($fpagesunique, 0);  
fputs ($fpagesunique, $nb_vues_par_page);  
fclose ($fpagesunique);  
?>

Objectif : Mettre en place un comptage des affichages page par page. chaque fois que je rencontre un $mot nouveau,

- je cree une page lemot.txt dans le dossier STATPAGES : ca c'est ok
- je fais +1
- je reecris la page

J'ai mis en en w+ puisque les pages n'éxistent par forcément.

Probleme : ca créé bien les pages mais elles restent désespéremment avec comme contenu 1 comme si le deuxieme coup et les suivants il se passait rien ...

Au'scour :wink:
 
WRInaute accro
bon je m'en suis sorti en faisant ca :

Code:
<?

global $nb_vues_par_page;

$fpagesunique = fopen ($_SERVER['DOCUMENT_ROOT']."/".STATPAGES."/".$mot.".txt", "a");
fclose ($fpagesunique); 

$fpagesunique = fopen ($_SERVER['DOCUMENT_ROOT']."/".STATPAGES."/".$mot.".txt", "r+");  
$nb_vues_par_page = fgets ($fpagesunique, 11);  
$nb_vues_par_page = $nb_vues_par_page + 1;  
fseek ($fpagesunique, 0);  
fputs ($fpagesunique, $nb_vues_par_page);  
fclose ($fpagesunique);  
?>

Pas sur que ca soit ni très catholique ni très efficace mais ca marche. j'ouvre en "a" pour le créer si besoin puis en "r+" pour le gérer.
 
WRInaute accro
A tester :
Code:
$fpagesunique = fopen ($_SERVER['DOCUMENT_ROOT']."/".STATPAGES."/".$mot.".txt", "w+");  
$nb_vues_par_page = fgets ($fpagesunique, 11);  
//nouveau fichier : on initialise la variable à 0 avant d'incrémenter
if ($nb_vues_par_page == "")
{
      $nb_vues_par_page = 0;
}
$nb_vues_par_page = $nb_vues_par_page + 1;  
fseek ($fpagesunique, 0);  
fputs ($fpagesunique, $nb_vues_par_page);  
fclose ($fpagesunique);

Un bon conseil pour tes futurs tests : fait des echo de tes variables au fur et à mesure pour identifier à partir d'où ça déconne.
 
Discussions similaires
Haut