Répertoire de codes source

MySQL: temporisation bdd
déposé par Zartan
le 03/03/2010
nombre de visites : 3496

edité le 12/03/2010
par Zartan

Quand vous utilisez MySQL sur un serveur mutualisé, vous avez le droit à un certain nombre de connexions simultanées.

Malheureusement certains bots comme ceux de google peuvent en prendre un certain nombre (jusqu'à 6) et votre limite peut se retrouver rapidement atteinte.

 Le code suivant fait entrer l'application en mode dégradé quand une erreur se produit. Il s'agit donc de temporiser pendant 1 seconde et de réessayer.

 On peut tester le comportement en cas de surcharge avec la commande ab:

ab -v4  -n50 -c50 http://monsite.com/index.php

 Avec une limite de 3 connexions sur la base de données, ce code supporte 50 connexions simultanées.

 

<?php
 
define('MAXTHREADS', 10) ; // dans MySQL cela correspond a max_connections ou max_user_connections
define('MAXRETRIES', 20) ; 
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
 
    protected function _initDb()
    {
		$pluginDb = $this->getPluginResource('db');
		$db = $pluginDb->getDbAdapter();
		$retries = 0 ;
		do {
			try
			{
				$threads = MAXTHREADS ;
				// Combien de connexions sont-elles ouvertes ? 
				$sql = "SHOW PROCESSLIST" ;
				$procs = $db->fetchAll($sql) ; // <-- la reconnexion s'effectuera ici si nécessaire
				$threads =  count($procs) ;
				/*
				 * utiliser si l'on a MAX_USER_CONNECTIONS > MAXTHREADS
				if ($threads >= MAXTHREADS) //
				{
					$db->closeConnection() ; 
					sleep(1) ;
				}
				*/
			}
			catch (Exception $e) // erreur SQL
			{
				if ($threads >= MAXTHREADS)
				{
					if (++$retries > MAXRETRIES)
					{
						die("server busy\n") ;
					}
					else
					{
						// fermer la connexion et attendre 1 seconde
						$db->closeConnection() ; 
						sleep(1) ;
					}
				}
			}
		} while ($threads >= MAXTHREADS) ;
        Zend_Db_Table::setDefaultAdapter($db);
    	return $db ;
    }
}
 
 
Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages