2014-05-12 5 views
6

J'ai lu dans le manuel PDO pour fermer la connexion, vous devez utiliser les éléments suivants:PDO MySQL Connection close - unset vs null

$connection = null; 

Cependant, certaines personnes ont suggéré que depuis PHP 5.3 a un nouveau GC, le suivant doit être utilisé:

unset($connection); 

J'ai besoin de savoir une fois pour toutes, que l'on préfère, ou sont-ils les mêmes?

+0

Pourquoi pensez-vous que vous le voulez? Avez-vous l'expérience d'un problème particulier en ce moment, causé par ce dilemme même? –

+0

Oui, un trop grand nombre de connexions entraîne des performances médiocres de mon système. Avant de subir toutes mes boucles, j'ai besoin de savoir comment le changer correctement. –

+0

[Relié ...] (http: // stackoverflow.com/questions/15444748/is-it-necessary-to-close-pdo-connections) – HamZa

Répondre

4

Ils font la même chose. La désactivation du handle $pdo et la définition de null annulent la connexion.

Vous pouvez tester cela par vous-même. Exécutez le script suivant dans une fenêtre et, dans une deuxième fenêtre, ouvrez le client MySQL et exécutez SHOW PROCESSLIST toutes les deux secondes pour voir quand la connexion disparaît.

<?php 

$pdo = new PDO(..); 
sleep(10); 
unset($pdo); 
echo "pdo unset!\n"; 
sleep(10); 

ensuite changer unset($pdo)-$pdo=null; et exécuter le test.

<?php 

$pdo = new PDO(..); 
sleep(10); 
$pdo = null; 
echo "pdo set null!\n"; 
sleep(10); 

Le sleep() supplémentaire à la fin est là pour vous donner un moment pour voir que la connexion a chuté, avant que le script PHP se termine (qui diminueraient la connexion de toute façon).

+0

La seule différence * small * que je vois est que 'unset()' va détruire la variable. Ce qui signifie 'var_dump ($ pdo);' lancerait une erreur 'Undefined variable'. – HamZa

+1

@HamZa, merci, c'est vrai! Je devrais dire, ils font la même chose * en ce qui concerne la fermeture de la connexion de base de données. * –

+1

Une réponse qui répond à l'OP littéralement, mais ne résout pas un seul problème pour l'OP. Je l'appelle "SO-way". –

-2

utilisant

$pdo = null; //is an assignment to null; the variable still declared in the memory. 

mais

unset($pdo); // will call the function to distroy also the adress "@" pointed by the variable. 

donc en utilisant unset préférions.

-3

Ne vous embêtez pas du tout. PHP va le fermer pour vous. Notez bien que votre application doit être bien conçue, sans avoir besoin de se reconnecter à différentes bases de données à un taux de mitrailleuse. Et même dans ce dernier cas, la méthode que vous utilisez pour fermer serait le moindre problème. Vous aboyez le plus mauvais arbre jamais. Travaillez le nombre de connexions, pas la façon dont vous les fermez.

+1

Ceci est totalement faux, et de très mauvais conseils. Certains scripts php sont de longue durée et ont besoin de récupérer des données à partir d'une base de données avant de lancer une longue tâche, et vous ne voulez pas garder un slot de connexion ouvert en veille pour rien. Il DOIT y avoir une bonne façon de fermer + libérer toute ressource en PHP: vrai pour le réseau, les connexions db, les sockets ou toute autre chose. Compter sur la valeur = null; l'affectation est très mauvaise, à mon humble avis. – Gabriel

2

J'ai trébuché avec ça. J'ai un objet PDO qui couvre l'installation et le démontage, et je ne peux pas trouver où il doit y avoir une référence restante, car la définition de $ pdo to null n'a pas résolu le problème.

Les notes fournies par l'utilisateur dans http://php.net/manual/en/pdo.connections.php traitent du problème de la fermeture différée. Ici, ils suggèrent de supprimer la connexion en cours:

$ pdo-> query ('SELECT pg_terminate_backend (pg_backend_pid());'); $ pdo = null;

Ceci est pour postgres. Pour mysql j'ai utilisé:

$ pdo-> query ('KILL CONNECTION CONNECTION_ID();');