Répertoire de codes source
MySQL: temporisation bdd | |
---|---|
déposé par Zartan le 03/03/2010 nombre de visites : 3581 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 ; } } |
|