2010-11-15 5 views
1

J'ai une application Web qui est utilisée par une entreprise pour consigner le travail de ses employés.Quelle est la meilleure façon de gérer "Attention: mysql_connect(): Trop de connexions" avec Kohana 3?

Beaucoup de gens sont souvent connectés en même temps.

L'application s'exécute sur un hôte partagé.

Je reçois parfois ...

Warning: mysql_connect() [function.mysql-connect]: Trop de connexions

Ce qui permet ensuite cascade d'autres erreurs ... comme des erreurs avec mysql_select_db(), mysql_error(), mysql_errnon() et enfin le non pris Database_Eexception.

Lorsque j'exécute ma demande principale, je l'enveloppe dans un try et capture toute exception et affiche une page introuvable. En effet, mes contrôleurs lancent généralement des exceptions si une ressource n'est pas trouvée (bien que la route soit valide), par exemple. http://example.com/products/30 est une route valide, mais le produit n ° 30 n'existe pas.

Quelle est la meilleure façon de gérer le trop de connexions? Idéalement, je voudrais capturer cette exception séparément, puis afficher une belle page qui informe l'employé d'essayer à nouveau dans 5 minutes.

Le code qui exécute ma demande principale application/bootstrap.php ressemble à ceci ...

$request = Request::instance(); 

try { 
    $request->execute(); 
} catch (Exception $e) { 

    if (Kohana::$environment === Kohana::DEVELOPMENT) throw $e; 

    // Log the error 
    Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e)); 

    // Create a 404 response 
    $request->status = 404; 
    $request->response = Request::factory(Route::get('catch_all')->uri(array('path' => 'errors/404')))->execute(); 
} 

$request->send_headers(); 
echo $request->response; 

Merci pour toute aide!

Répondre

1

Je viens de créer ce fichier pour gérer toutes les erreurs:

<?php 

class Kohana extends Kohana_Core 
{ 
    /** 
    * Redirect to custom exception_handler 
    */ 
    public static function exception_handler(Exception $e) 
    { 
    if (Kohana::DEVELOPMENT === Kohana::$environment) 
    { 
     // Pass to Kohana if we're in the development environment 
     parent::exception_handler($e); 
    } 
    else 
    { 
     Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e)); 

     // Default route 
     $route = Route::url('default', array('controller' => 'error', 'action' => '404')); 

     // Error sub-request. 
     echo Request::factory($route) 
     ->execute() 
     ->send_headers() 
     ->response; 
    } 
    } 
} 

Pour l'instant, il est juste un croquis, mais il pourrait vous donner quelques idées.

ps: mon bootstrap n'est pas modifié

+0

Peut-être devriez-vous utiliser 'set_exception_handler()' au lieu de changer la logique de la classe de base du système? Quelque chose comme 'si (Kohana :: DEVELOPMENT! == Kohana :: $ environnement) {set_exception_handler (array ('Kohana', 'exception_handler'));}' dans bootstrap.php – biakaveron

+0

@biakaveron: pour quelle raison?C'est un polymorphisme statique - donc je viens de remplacer une méthode. – zerkms

1

Vous souhaiterez peut-être commencer par vérifier la valeur actuelle de votre propriété système MySQL max_connections et voir comment elle compare les exigences d'utilisation. Si vous n'avez pas un bon contrôle sur les exigences d'utilisation, vous pourriez faire pire que d'instrument votre code pour enregistrer les données sur les connexions simultanées; ou votre outil de profilage de base de données en direct pour surveiller cela.

Vous pouvez également vérifier si votre code bloque trop longtemps les connexions (c'est-à-dire inutilement) et corrigez-le. Peut-être étudier la mise en commun des connexions.

1

Dans /etc/my.cnf sous la section Ajouter [mysqld]:

max_connections = 500 

Ensuite, soit exécuter SET GLOBAL max_connections = 500; dans MySQL ou redémarrer MySQL.

Questions connexes