Page 1 sur 1

Problème de connexions en état sleep

Posté : 12 avr. 2012, 11:34
par MisterSnow
Bonjour à tous,

Alors voilà mon site plante régulièrement et mon hébergeur me dit que le soucis vient de connexions à la base de données qui passent en état sleep et qui empêchent l'ouverture de nouvelles connexions.
En allant regarder dans mes logs pour essayer de voir d'où vient le problème j'ai trouvé pas mal d'erreurs du type:

[Thu Apr 12 10:14:51 2012] [error] [client XX.XX.XX] script '/[...]/21820.php' not found or unable to stat
[Thu Apr 12 10:14:51 2012] [error] [client XX.XX.XX] File does not exist: /[...]/21820.swf

Je suis donc aller voir le code correspondant à ces erreur dans mes pages:
<?php if (fopen($_animation, "r")): ?>
[...]
<?php if (fopen($_video, "r")): ?>
Du coup, je me pose la question suivante, est ce qu'un script comme ci-dessus (qui tente d'ouvrir un fichier en lecture seul et place le pointeur au début du fichier) peut induire des connexions en état sleep dans le cas ou le fichier n'existe pas ?

En vous remerciant par avance,
M.S

Re: Problème de connexions en état sleep

Posté : 12 avr. 2012, 11:54
par moogli
Salut,

Y a des fclose ?

Parce qu'en dehors d'accès concurrent je vous le soucis ^^

@+

Re: Problème de connexions en état sleep

Posté : 12 avr. 2012, 12:03
par MisterSnow
Arf zut ! Non pas de fclose, je crois que j'ai du oublier ça... :oops:

Donc si j’interprète bien la piste que tu m'as donné, je suppose qu'il faut que je mette des fclose sans quoi le fichier reste ouvert et la connexion ne se ferme pas et passe en état sleep ?
Si c'est bien ça c'est super ça veut dire que mon soucis est identifié !
Peux-tu confirmer ?

Re: Problème de connexions en état sleep

Posté : 12 avr. 2012, 12:52
par moogli
C'est une supposition, mais après je n'en suis pas certain, ce serait étonnant de garder un pointeur de fichier ouvert alors que le script est terminé.
Après le message d'erreur est assez flou et le peu de code fournit n'est pas en adéquation avec le problème evoqué.

Tu parle de connexion au sgbd, j'imagine donc des connexions ouverte qui ne sont pas fermées et reste latente (ou en veille vu ce que tu dit). Donc la je dirais : il ne faut pas utiliser de connexion persistante (mysql_pconnect par exemple) qui fut toujours mettre des mysql_free_result et surtout des mysql_close() a la fin du script même si php doit normalement clore les connexions il est préférable de le faire.

Ton code de deux lignes indique des fopen d'où ma réponse.
Le log que tu montre te dit que le fichier 21820.swf n'existe pas, au un rapport avec un sgbd.

Mais si tu a un message d'erreur clair, et le code associé ce serait plus simple ;)
Voir la réponse exact de l'hébergeur.

Globalement il faut toujours libérer les ressources lorsque l'on en a plus besoin.


@+

Re: Problème de connexions en état sleep

Posté : 12 avr. 2012, 16:24
par MisterSnow
Merci moogli pour ta réponse détaillée.

Voici la réponse de mon hébergeur:
Comme vu à l'instant au téléphone, il s'agissait de connexions qui ne s'étaient
pas fermées en base de données, empêchant de nouvelles de s'établir.
--
Concernant ces connexions en sleep, il s'agit de connexions à la base de données
qui sont ouvertes mais qui ne font rien (pas de requête à traiter).

Typiquement, si une connexion reste en état sleep trop longtemps, c'est qu'il
s'agit d'un script qui n'a pas fermé correctement la connexion à la base de
données (quelque soit la raison) et cette connexion reste active. Au bout d'un
moment, cela crée une accumulation de connexions inutiles mais qui bloquent
l'établissement de nouvelles connexions et donc rendent le site inaccessible. Un
redémarrage d'Apache permet de forcer la fermeture de ses connexions (la
connexion étant perdue quand les processus Apache vont se fermer).
Dans mes logs php je n'ai rien trouvé et dans mes logs d'erreur j'ai plusieurs fois des erreurs du type que j'ai donné:
[Thu Apr 12 10:14:51 2012] [error] [client XX.XX.XX] script '/[...]/21820.php' not found or unable to stat

Pour etre plus précis:
client XX.XX.XX -> il s'agit de l'adresse IP du serveur sur lequel je suis hébergé.
/[...]/21820.php -> le chemin d’accès au fichier sur lequel l'ouverture a été tentée (via le fopen) mais qui a échouée puisqu'il n'existe pas.

Ce message d'erreur est du au petit développement que j'ai fait dont le but est d'afficher du contenu en fonction de la présence ou non d'un fichier.
Je dirai que celui est "normal" car il apparait quand le visiteur visite une page sur laquelle mon bloc de contenu ne doit pas apparaître.

Pour tester la présence du fichier, j'ai bien entendu essayé avec les fonction php "classiques" is_file ou file_exists ou encore is_readable mais celles-ci ne fonctionnent pas c'est pour ça que je suis passé par la fonction fopen
Comme je débute en programmation, je ne savais pas qu'après un fopen il était d'usage de mettre un fclose.

Voici mon code mais je ne suis pas sur qu'il soit correcte.
<?php
$_animation = $this->getSkinUrl('blocks/animations/'.$_productID.'.php');
$ouverture = fopen($_animation, "r");
if ($ouverture == true) {
	echo"<div>contenu</div>";
	fclose($ouverture);
	}
?>

Après effectivement mes connexions qui se mettent en état sleep ne vienne sans doute pas de ce script.
En tout cas merci pour ton aide.

Re: Problème de connexions en état sleep

Posté : 13 avr. 2012, 12:10
par moogli
Ok, tu a donc deux soucis :
- le premier tu ne ferme pas les connexions au sgbd et php les gardent persistante
- le second : tu n'arrive pas a tester l existence d'un fichier.

Je te propose de voir le premier problème ici et d'ouvrir un second sujet pour le deuxiemme afin que cela ne soit pas le bordel ;)

Donc :
- quel sgbd utilise tu ? (typiquement mysql mais ça peu être un autre)
- commet réalise tu la connexion au sgbd (à chaque page, avec les fonction e de base, un objet Perso, avec pdo ?)
- as tu fait le code complet ? (important pour savoir si tu va pouvoir te dépatouiller facilement ;) )

Avec ça on a un peu de matière pour avancer.
Dans le ça mysql, avec les fonctions de l'extension mysql, typiquement on fait ainsi :
<?php
mysql_connect('host','user','passwd') ;
mysql_selected_db('la base');
// les requêtes 
mysql_close(); // c'est ça qui manque
?>
J'allais oublier : qu'elle version de php ? ;)

@+