2009-07-06 9 views
0

Im en utilisant ce code pour la connexion mysqlconnexion mysql

$con = mysql_connect("localhost:/var/lib/mysql/mysql.sock", "abc" , "xyz"); 
if (!$con) 
{ 
    die('Could not connect: '); 
} 
mysql_select_db("database_name", $con); 

Im incluant ce fichier sur le dessus de chaque fichier php qui im ​​utilisant pour l'analyse et le stockage des données dans database.Now lorsque le site d'origine descend alors mes fichiers d'analyse syntaxique commence à donner erreur « Warning: mysql_connect(): Trop de connexions à /home/clickindia/public_html/appuonline/db.php sur la ligne 2 Impossible de se connecter: »

Que dois-je faire pour sauver mon site de ces erreurs. Pensez-vous que je devrais utiliser mysql_close ($ con); Mais comment et où ??? Im utilisant mourir dans mon code est-ce correct ou devrais-je utiliser à proximité, etc. aide plz !!

Répondre

1

Vous dites que vous mettez ce code de connexion "au sommet de chaque fichier php".

Ma question est: utilisez-vous plusieurs de ces fichiers pour une seule page?

Si c'est le cas, vous ne devez ouvrir la connexion qu'une seule fois pour une page. Cela pourrait être l'explication de l'erreur.

Les conseils d'Artem sont également pertinents.

0
  1. Ne pas display errors au public, en particulier en production.

  2. Utilisez exceptions au lieu de die.

  3. Manipulez vos échecs avec élégance - ce type va de pair aveC# 1. Ne vous contentez pas de mourir: redirigez-vous vers une page d'erreur ou affichez un message temporaire "Impossible d'enregistrer les données".

  4. Configurez les esclaves MySQL et interrogez-les si vous le pouvez. La réplication vous aidera toujours avec la stabilité et les points de défaillance uniques (dans une certaine mesure).

+0

Les trois premiers sont tous de bonnes idées, mais ne sont pas vraiment pertinents pour le problème du PO. Le dernier n'est pas une bonne idée dans le cas général et doit être considéré très attentivement seulement dans le cadre d'un déploiement plus large avec toutes ses réserves évaluées. – MarkR

1

Ceci est vraiment un problème de sysadmin - vous devriez contacter votre gestionnaire de systèmes. Si vous avez dédié Hébergeurs et hôte de base de données dédiée que vous gérez la configuration, il y a deux solutions évidentes à cela:

  1. Augmenter max_connections
  2. Reconfigurer votre application à consommer moins

serveurs Web qui se connecter sur chaque page peut en utiliser beaucoup.

0

mysql a une limitation sur le nombre de connexions qu'il peut donner au client (bibliothèque client php dans ce cas). Mysql_connect() ouvre une ou plusieurs nouvelles connexions et ne ferme pas l'ancienne connexion. Vous pouvez utiliser mysql_pconnect pour résoudre ce problème.

+0

L'utilisation de mysql_pconnect ne ferait qu'aggraver les choses, en s'accrochant aux connexions même quand elles n'en avaient plus besoin. – MarkR

1

Vous pouvez envisager d'envelopper un singleton autour de l'accès à la base de données. Avantages:

  • Vous ne pouvez utiliser qu'une seule connexion.
  • Vous n'ouvrez une connexion que si vous en avez besoin (plutôt que de vous connecter arbitrairement sur chaque page).

Vous pouvez rouler votre propre singleton ou en obtenir un dans un framework, ce qui pourrait être exagéré en fonction de ce sur quoi vous travaillez. Les bases seraient quelque chose comme ceci:

class DatabaseAccess { 
    private static $instance; 
    private $connection; 

    //declare the constructor private so we can only use it in this class 
    private function __construct($host, $user, $pass, $db) { 
     $this->connection = mysql_connect($host, $user, $pass); 
     mysql_select_db($db, $this->connection); 
    } 

    //provide access to a single instance 
    public static function instance() { 
     if (! isset(self::$instance)) { 
      self::$instance = new DatabaseAccess('host', 'user', 'pass', 'db'); 
     } 
     return self::$instance; 
    } 

    //functions to execute/query the db 
    public function query($query) { 
     return mysql_query($query, $this->connection); 
    } 

} 

Si je devais aller dans cette voie, je ferais probablement ce en contrôlant l'accès à une instance de mysqli et l'utiliser directement plutôt que envelopper les mysql_ * fonctions. Vous pouvez en savoir plus sur le modèle singleton sur wikipedia.

Votre demande alors travailler avec la classe comme ceci:

$dba = DatabaseAccess::instance(); 
$result = $dba->query('select * from pages'); 
mysql_fetch_assoc($result); 
//blah blah blah 

Hope that helps!

0

Vous pouvez également utiliser mysql_pconnect:

établit une connexion persistante à un serveur MySQL. Mysql_pconnect() ressemble beaucoup à mysql_connect() avec deux différences majeures.

  • Il va essayer de réutiliser une connexion ouverte qui est le même.

  • Il ne ferme pas la connexion à la fin du script.

Questions connexes