Salut à tous,

Aujourd’hui, j’écris un article sur un sujet qui pose beaucoup de problème à nous Webmaster et blogueur: c’est la limitation du nombre de connexions simultanées par base MySQL. La plupart des hébergements mutualisé impose cette limite, qui est souvent de 10 connections simultanées; C’est à dire que la 11éme personne qui se connecte à la base reçoit un vilain message d’erreur de ce type « Error establishing a database connection ». Quand un site utilisant MySQL commence à être connu et reçoit beaucoup de visiteurs: ce type d’erreur devient très fréquent, il faut alors changer d’offre prendre un serveur dédié ou un SQL privé (existe chez OVH uniquement à ma connaissance); sinon vos visiteur ne reviendrons pas et votre hebergeur risque de suspendre votre compte.

Il reste encore à savoir si ce type d’erreur apparaisse sont fréquente sur votre site. Pour avoir cette information nous allons programmer un code PHP qui envoi un email à chaque fois que le nombre de connections simultanées est dépassé.

Le code PHP que je vais mettre à votre disposition est placer: sur vos scripte PHP avent chaque connexion à une base MySQL.

  1.  
  2. <?php
  3. error_reporting(E_ALL & ~E_NOTICE);
  4. function myErrorHandler ($errno, $errstr ,$errfile, $errline, $errcontext) {
  5.   $error_msg =  "Date :  " . date("d/m/Y H:i:s") . "\n";
  6.   $error_msg .= "Erreur : ". $errstr . "\n";
  7.   $error_msg .= "Fichier : ". $errfile . "\n";
  8.   $error_msg .= "Ligne  : ". $errline . "\n";
  9.   $error_msg .= "Referer : ". $_SERVER[‘HTTP_REFERER’]  . "\n";
  10.   $error_msg .= "\n";
  11.  
  12.   ob_start();
  13.   print_r($errcontext);
  14.   print_r($_SERVER);
  15.   print_r($_COOKIE);
  16.   print_r($_GET);
  17.   print_r($_POST);
  18.   print_r($_SESSION);  
  19.   $error_msg .= ob_get_contents();
  20.  
  21.   switch($errno) {
  22.     case E_USER_NOTICE:
  23.     case E_NOTICE:
  24.       break;
  25.     case E_USER_WARNING:
  26.     case E_COMPILE_WARNING:
  27.     case E_CORE_WARNING:
  28.     case E_WARNING:
  29.     case E_USER_ERROR:
  30.     case E_COMPILE_ERROR:
  31.     case E_CORE_ERROR:
  32.     case E_ERROR:
  33.     case E_PARSE:    
  34.       $headers ="From: \"MON_SERVEUR\" <mon_serveur@email.com>\n";
  35.       $headers .="Content-Type: text/plain; charset=\"iso-8859-1\"\n";
  36.       $headers .="Content-Transfer-Encoding: 8bit";
  37.       mail("mon_adresse_email@email.com", "ERREUR – MON_SITE – " . date("Y-m-d_H:i:s"), $error_msg, $headers);
  38.       break;
  39.   }
  40. }
  41. set_error_handler("myErrorHandler");
  42. ?>
  43.  

Inutile de préciser qu’il faut remplacer « mon_adresse_email@email.com » par l’adresse email ou les notification doivent être envoyé.

Ce système de monitoring averti par email si un internaute se trouve confronté à ce problème de limite de connections simultanées. des lors que tu reçois beaucoup de email de saturation de t’as base MySQL, alors il faut envisager un évolution hébergement. L’option SQL privé d’OVH est une bonne solution qui évité de s’embêter a configurer et gérer un serveur dédié; le présenterai cette option d’ici quelques jours.

(Photo)

7 commentaires pour “MySQL – Alerte email quand trop de connections simultanées”

  • Intéressant, cela fait quelques temps que je me tâte à propos des BD de chez OVH et leur limite en mutualisé. J’attends avec impatience ton article sur l’option SQL Privé, ça pourra peut être m’aider à me décider ;-)

  • Salut Quentin,

    tiens, je ne connaissais pas cette limite de 10 connections simultanées sur MySQL ! Tu es sûr de ça, ça paraît tellement peu !

    Très bon article, et ton code semble bien monté ! Tu intègres ça comment sous WordPress, par un php.ini ?

  • Cette limite est présente par exemple chez OVH (http://www.ovh.com/fr/hebergement_mutualise/sql_perso.xml)
    En principe sur un hébergement mutualisé tu n’a pas accès aux fichier php.ini
    WordPress est un CMS compliqué! Peut être qu’il faut le placer dans le fichier wp-config.php, je ne sais pas

  • Salut Quentin,

    ben avec une petite requête sur un fichier phpini.php du style :
    <?php
    // set this value to Y if you only want to overwrite old php.ini files
    // set this value to N if you want to put a php.ini file in every directory
    $overwriteOnly = "N";

    if ($overwriteOnly == "Y") echo "Operating in Overwrite Only Mode";
    $path = "CHEMIN DU SITE";
    $source = $path . "/php.ini";
    if (!file_exists($source)) die('Error - no source php.ini file');
    function search($dir) {
    global $source;
    global $overwriteOnly;
    $dh = opendir($dir);
    while (($filename = readdir($dh)) !== false) {
    if ( $filename !== '.' AND $filename !== '..' AND $filename !== 'cgi-bin' AND is_dir("$dir/$filename") ) {
    $path = $dir."/".$filename;
    $target = $path . "/php.ini";
    if (!file_exists($target) AND $overwriteOnly == "Y") {
    echo "$path skipped - no php.ini file";
    } else {
    echo "$target ";
    if (!copy($source,$target)) echo "Write failed for $target ";
    if (file_exists($target)) chmod($target,0600);
    }
    search($path);
    }
    }
    closedir($dh);
    }
    search($path);
    echo "Done.";
    ?>

    tu peux balancer n’importe quel php.ini sur ton serveur, mutualisé ou pas ;)

    Je suis sous 1&1& et ça marche super bien.

  • Si le script est fait maison, il peut aussi être intéressant de l’optimiser et couper rapidement la connection avec mysql_close() pour éviter au max ce soucis.

  • Quid des performances des bases SQL privées chez OVH ? Les avis sont très partagés ont dirait…

  • ben j’ai appris quelque chose la…..merci

Laisser un commentaire


Blogroll