Discussion:
mysql_connect: et la fermeture?
(trop ancien pour répondre)
Rakotomandimby (R12y) Mihamina
2008-10-09 22:52:45 UTC
Permalink
Bonjour,
Je reprends une application en PHP (on s'en serait douté) qui a la
connexion à la base de données dans un fichier à part et qui est
systématiquement "includé_once" par chaque fichier PHP existant (sauf
quelques exceptions).
Dans le code pris dans sa globalité, aucune fermeture de la connexion à
la base de données.
On teste sur le réseau local, on sent bien les quelques milliers de
requetes générées par les scripts, mais même en y mettant du coeur, on
n'arrive pas à faire raler le serveur de base de données (il devrait
raler à cause du nombre trop important de connexions "ouvertes"), qui a
quand même un paramétrage par défaut (Ubuntu).

Le fait de ne pas fermer la connexion à la base de données semble
contenu par un espece de ramasse miette. Est-ce le cas? Devrait-on
fermer la connexion à la base de donnée apres s'en etre servi?

Configuration: PHP5, Mysql 5, Ubuntu server 8.04.
Olivier Miakinen
2008-10-09 22:58:29 UTC
Permalink
Post by Rakotomandimby (R12y) Mihamina
[...]
Le fait de ne pas fermer la connexion à la base de données semble
contenu par un espece de ramasse miette. Est-ce le cas? Devrait-on
fermer la connexion à la base de donnée apres s'en etre servi?
Configuration: PHP5, Mysql 5, Ubuntu server 8.04.
Dans <http://fr2.php.net/manual/fr/language.types.resource.php>, à
l'erreur de traduction près, on lit :

<cit.>
Libération des ressources

[Grâce au] système de comptage des références, introduit dans le moteur
Zend PHP 4, une ressource qui n'a plus aucune référence est détectée
automatiquement, et est libérée par le collecteur. Pour cette raison, il
est rarement nécessaire de libérer la mémoire manuellement.
</cit.>
Sylvain SF
2008-10-09 23:08:58 UTC
Permalink
Post by Rakotomandimby (R12y) Mihamina
Le fait de ne pas fermer la connexion à la base de données semble
contenu par un espece de ramasse miette. Est-ce le cas? Devrait-on
fermer la connexion à la base de donnée apres s'en etre servi?
Configuration: PHP5, Mysql 5, Ubuntu server 8.04.
selon la doc (de mysql_connect):

The link to the server will be closed as soon as the execution of
the script ends, unless it's closed earlier by explicitly calling
mysql_close().

Sylvain.
Pascal PONCET
2008-10-10 13:26:52 UTC
Permalink
Post by Rakotomandimby (R12y) Mihamina
Le fait de ne pas fermer la connexion à la base de données semble
contenu par un espece de ramasse miette. Est-ce le cas? Devrait-on
fermer la connexion à la base de donnée apres s'en etre servi?
Bonjour,

Effectivement, la fermeture est automatique depuis PHP4.
La libération de ressource se fait à la fin du script.

Si les fonctions de fermeture sont encore disponibles dans les API des
différents SGBD supportés par PHP, c'est uniquement pour permettre la
libération de ressource dans un même script global en cours (par
"global", j'entends comme tenant compte de tous les include demandés,
donc le script vu du côté du moteur Zend).

C'est surtout intéressant, je crois, lorsqu'on a besoin de se connecter
à plusieurs serveurs SGBD de façon consécutive dans le script global.
On peut ainsi en libérer un dès qu'on a fini les requêtes lui étant
adressées.

Ça n'a, par contre, aucun rapport avec le nombre de connexions
simultanées sur un serveur ou, corolaire, le nombre d'utilisateurs
connectés.

Cordialement,
Pascal
Antoine ROUCHET
2008-10-25 22:18:21 UTC
Permalink
Post by Rakotomandimby (R12y) Mihamina
On teste sur le réseau local, on sent bien les quelques milliers de
requetes générées par les scripts, mais même en y mettant du coeur, on
n'arrive pas à faire raler le serveur de base de données (il devrait raler
à cause du nombre trop important de connexions "ouvertes"), qui a quand
même un paramétrage par défaut (Ubuntu).
Bonjour,

Pourquoi devrait-il y avoir un nombre important de connexions ouvertes?

Si le script créant la connexion est reférencé via la directive
include_once(), alors il n'est inclu qu'une seule fois, et donc exécuté
qu'une seule fois (par session évidemment).

De plus, la fonctione mysql_connect() en elle même ne permet pas (sauf
demande explicite) d'ouvrir 2 connexions distincts vers un même serveur
MySQL (avec le même login et le même password). En résumé, si je fais:

$a = mysql_connect ("mon.sgbd.local", "mon_user", "mon_pass");
$b = mysql_connect ("mon.sgbd.local", "mon_user", "mon_pass");

alors $b est une copie de $a et une seule connexion vers le serveur MySQL
est ouverte.

Antoine.

Continuer la lecture sur narkive:
Loading...