WampServer

Apache, PHP, MySQL on Windows 

 
  • Accueil forum
  • Retour à WampServer
  • presentation
  • Download
  • Addons
  • Formations
  • Alter Way

 
Voir le sujet: Précédent•Suivant
Aller à : Liste des Forums•Liste des messages•Nouvelle discussion•Recherche•Connexion•Imprimer la vue
fichier log
Envoyé par: Jean74 (---.28.71-86.rev.gaoland.net)
Date: 04 March 2010 à 16:28

Bonjour

Comment puis je enregistrer toutes les requetes dans le fichier log (ou un autre fichier):

Cordialement

Jean

Options: Répondre•Citer ce Message
Re: fichier log
Envoyé par: Otomatic (---.fbx.proxad.net)
Date: 05 March 2010 à 18:30

Bonjour,

Dans le fichier wamp\bin\mysql\mysql5.1.xy\my.ini, dans la section [mysqld], simplement mettre :
[mysqld]
#Name of the queries log file (In datadir)
log=mon_fichier.log

Le résultat sera du genre :
wampmysqld, Version: 5.1.44-community-log (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: (null)
Time                 Id Command    Argument
100305 18:24:13	    1 Connect	root@localhost on 
		    1 Init DB	aviatechno
		    1 Query	SELECT m_date AS maj FROM avia_modifs ORDER BY m_date DESC LIMIT 1
		    1 Query	SELECT conf_value AS forum_maintenance FROM punbb_config WHERE conf_name = 'o_maintenance'
		    1 Query	SELECT m_type AS type, m_texte AS texte FROM avia_modifs ORDER BY m_id DESC LIMIT 10
		    2 Quit

---------------------------------------------------------------
Documentation Apache - Documentation PHP - Documentation MySQL - Wampserver install files & addons



Modifie 1 fois. Derniere modification le 05/03/2010 à 18:36 par Otomatic.

Options: Répondre•Citer ce Message
Re: fichier log
Envoyé par: Jean74 (---.28.71-86.rev.gaoland.net)
Date: 05 March 2010 à 19:47

Merci pour cette excellente réponse.

Cordialement

Jean

Options: Répondre•Citer ce Message
Re: fichier log
Envoyé par: Otomatic (---.fbx.proxad.net)
Date: 06 March 2010 à 17:09

Bonjour,

Mettre "log=mon_fichier.log" dans my.ini permet effectivement de « voir » les requêtes effectuées et peut être utile dans certains cas de développement. En revanche, nous n'avons aucune information sur la durée de chaque requête ni sur les requêtes effectuées pour une page d'un site.

Mettre des appels mysql_query(...) à chaque fois que l'on a besoin d'effectuer une requête ne permet ni de les mémoriser, ni de calculer leur durée. Pour ce faire, il faut « centraliser » les requêtes, donc créer une class PHP (Voir [www.php.net]).
Je vous propose ci-après, une class MySQL, diverses fonctions associèes et la manière de gérer l'affichage des requêtes et leur durée.
Nota : Tout ce qui suit fonctionne parfaitement en local sous Wampserver et chez deux hébergeurs différents avec, au minimum, PHP 5.1.3 et MySQL 5.0.51

---- Fichier config_base.php ----
Dans le fichier config_base.php (Ce peut être un autre fichier sur votre configuration) qui donne les noms d'hôte, utilisateur, mot de passe, base de données, etc. on va ajouter la définition d'une constante VOIR_REQUETE qui restera commentée par défaut et ne sera décommentée que lorsque l'on voudra afficher les requêtes.
<?php
//Définition des variables MySQL en fonction de l'hébergeur
// Afficher en bas de page toutes les requêtes exécutées
// en décommentant le ligne suivante (Ne pas utiliser en production)
//define('VOIR_REQUETES', 1);

switch ($_SERVER['SERVER_NAME']) {
  case "aviatechno.free.fr": //Site chez free.fr
    $db_host = 'sql.free.fr';
    $db_name = 'database_free.fr';
    $db_username = 'user_free.fr';
    $db_password = 'mot_de_passe_sql_free';
  break;
  case "aviatechno": //Site local Wampserver
    $db_host = 'localhost';
    $db_name = 'database_locale';
    $db_username = 'user_local';
    $db_password = 'mot_de_passe_local';
    break;
  case "aviatechno.info": //Site chez 1and1
    $db_host = 'dbxyz.1and1.fr';
    $db_name = 'database_1and1';
    $db_username = 'user_1and1';
    $db_password = 'mot_de_passe_1and1';
  break;
  default:
    $db_host = NULL;
    $db_name = NULL;
    $db_username = NULL;
    $db_password = NULL;
}
?>

---- Fichier mysql.php ----
Fichier contenant la création de la class et la connexion à la base de donnée définie dans le fichier config_base.php
<?php
include_once('mysql_fonctions.php');

class Data_Base {
  var $prefix;
  var $link_id;
  var $query_result;
  var $saved_queries = array();
  var $num_queries = 0;

  //Connexion à Mysql puis à la base de données
  function __construct($db_host, $db_username, $db_password, $db_name, $db_prefix = ""winking smiley {
    $this->prefix = $db_prefix;
    $this->link_id = mysql_connect($db_host, $db_username, $db_password);
    if ($this->link_id) {
      if (@mysql_select_db($db_name, $this->link_id)) return $this->link_id;
      else error('Impossible de se connecter à la base de données. MySQL dit : '.mysql_error(), __FILE__, __LINE__);
    }
    else error('Impossible de se connecter au serveur MySql. MySQL dit : '.mysql_error(), __FILE__, __LINE__);
  }

  function query($sql) {
    if (strlen($sql) > 50000) exit('Requête bien trop importante.');
    if (defined('VOIR_REQUETES')) $q_start = lire_microtime();
    $this->query_result = @mysql_query($sql, $this->link_id);
    if ($this->query_result) {
      if (defined('VOIR_REQUETES')) $this->saved_queries[] = array($sql, (lire_microtime() - $q_start));
      ++$this->num_queries;
      return $this->query_result;
    }
    else {
      if (defined('VOIR_REQUETES')) $this->saved_queries[] = array($sql, 0);
      return false;
    }
  }

  function result($query_id = 0, $row = 0) {
    return ($query_id) ? @mysql_result($query_id, $row) : false;
  }

  function fetch_assoc($query_id = 0) {
    return ($query_id) ? @mysql_fetch_assoc($query_id) : false;
  }

  function fetch_row($query_id = 0) {
    return ($query_id) ? @mysql_fetch_row($query_id) : false;
  }

  function num_rows($query_id = 0) {
    return ($query_id) ? @mysql_num_rows($query_id) : false;
  }

  function affected_rows() {
    return ($this->link_id) ? @mysql_affected_rows($this->link_id) : false;
  }

  function insert_id() {
    return ($this->link_id) ? @mysql_insert_id($this->link_id) : false;
  }

  function get_num_queries() {
    return $this->num_queries;
  }

  function get_saved_queries() {
    return $this->saved_queries;
  }

  function free_result($query_id = false) {
    return ($query_id) ? @mysql_free_result($query_id) : false;
  }

  function escape($str) {
    if (is_array($str)) return '';
    else if (function_exists('mysql_real_escape_string')) return mysql_real_escape_string($str, $this->link_id);
    else return mysql_escape_string($str);
  }

  function error() {
    $result['error_sql'] = @current(@end($this->saved_queries));
    $result['error_no'] = @mysql_errno($this->link_id);
    $result['error_msg'] = @mysql_error($this->link_id);
    return $result;
  }

  function close() {
    if ($this->link_id) {
      if ($this->query_result) @mysql_free_result($this->query_result);
      return @mysql_close($this->link_id);
    }
    else return false;
  }
}
//Connection à MySql et à la base de données
$db = new Data_Base($db_host, $db_username, $db_password, $db_name);
?>

Cette class est écrite de telle manière qu'il n'y ait que peu de changement par rapport aux appels classiques :
$result = mysql_query($sql); devient $result = $db->query($sql);
$row = mysql_fetch_row($result); devient $row = $db->fetch_row($result);
et ainsi de suite.
Nota : la fonction de fermeture $db->close() n'a pas subit le bug PHP 5.3.0 parce que elle mentionne le nom de la connexion ouverte.
Ce fichier fait appel au fichier mysql_fonctions.php

---- Fichier mysql_fonctions.php ----
Définitions de trois fonctions, dont la fonction affichage des requêtes et la fonction error
<?php
function lire_microtime() {
  list($usec, $sec) = explode(' ', microtime());
  return ((float)$usec + (float)$sec);
}

//Affiche les requêtes
function voir_requetes_memorisees() { 
  global $db;
  $saved_queries = $db->get_saved_queries();
  $nb_queries = count($saved_queries);
  echo "<div id='requete'>\n";
  if($nb_queries > 0) {
    echo "<table>\n";
    echo "<caption>Informations d'accès à la base de données</caption>\n";
    echo "<tr><th>N°</th><th>Durée (s)</th><th style='width:656px;'>Requête</th></tr>\n";
    $query_time_total = 0.0;
      for($i=0;$i < $nb_queries;$i++) {
        list(, $cur_query) = each($saved_queries);
        $query_time_total += $cur_query[1];
        echo "<tr><td style='text-align:right;'>".($i+1)."</td>";
        echo "<td style='text-align:center;'>".(($cur_query[1] != 0) ? sprintf('%.6f',$cur_query[1]) : '&nbsp;')."</td>";
        echo "<td>".htmlspecialchars($cur_query[0])."</td></tr>\n";
      }
      echo "<tr><td colspan='3' style='text-align:center;'>Durée totale des requêtes : ".sprintf('%.6f',$query_time_total)." s</td></tr>\n";
      echo "</table>\n";
   }
   else echo "<p>Aucun accès à la base de données</p>\n";
    echo "</div>\n";
}

// Affiche un message d'erreur
function error($message, $file="", $line=0, $db_error = false) {
// Vide le buffer
@ob_end_clean();
// Redémarre le buffer
ob_start('ob_gzhandler');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "[www.w3.org];
<html>
<head>
<meta http-equiv='content-type' content='text/html; charset=iso-8859-1'>
<meta http-equiv='Content-Language' content='fr'>
<title>Erreur</title>
</head>
<body id='debut_'>
 <h2>Désolé, une erreur est survenue</h2>
 <?php
 echo "<p>".$message."</p>\n";
 if(defined('OTO_DEBUG')) {
  if($file !=""winking smiley echo "<p>Fichier : ".$file;
  if($line !=0) echo "&nbsp;-&nbsp;Ligne : ".$line;
  echo "</p>\n";
 }
 else echo "<h2>Merci d'en informer le responsable du site</h2>\n";
 ?>
</div>
</body>
</html>

<?php
// Si une connexion base de données déjà établie, on la ferme
  if ($db_error) $GLOBALS['db']->close();
  exit;
}
?>

Maintenant, il ne reste plus qu'à gérer l'ordre des appels et l'affichage des requêtes pour une page.
Au début de chaque page :
include('chemin_du_fichier/config_base.php');
include('chemin_du_fichier/mysql.php');
...
$sql = "SELECT ... FROM ... ";
$result = $db->query($sql);
extract($db->fetch_assoc($result));
et, à la fin de chaque page :
if (defined('VOIR_REQUETES')) voir_requetes_memorisees();
if(isset($db)) $db->close();
En décommentant la ligne //define('VOIR_REQUETES', 1); du fichier config_base.php, voilà ce qu'on peut obtenir:


C'était un peu long et j'espère que ça vous sera profitable.

---------------------------------------------------------------
Documentation Apache - Documentation PHP - Documentation MySQL - Wampserver install files & addons

Options: Répondre•Citer ce Message


Aller à : Liste des Forums•Liste des messages•Recherche•Connexion
Désolé, seuls les utilisateurs connectés peuvent envoyer des messages dans ce forum.
Cliquer ici pour se connecter

design by jidePowered by Alter Way get firefoxget PHP