2009-10-20 8 views
0

J'ai un script qui prend plusieurs minutes à exécuter. La connexion mysql est établie au début (mysql_connect), suivie d'une boucle avec quelques requêtes (mysql_query). Cette boucle dure très longtemps, et après quelques minutes le script jette un avertissement que le serveur mysql est parti (l'argument fourni n'est pas une ressource de résultat MySQL valide)La connexion mysql se ferme après un certain temps? (PHP)

La connexion se ferme automatiquement après un certain temps d'exécution, même si les requêtes sont effectuées et les résultats sont récupérés?

Répondre

2

"L'argument fourni n'est pas une ressource de résultat MySQL valide" signifie qu'une fonction mysql _...() s'attend à ce que vous passiez une ressource de résultat mais que vous ayez passé autre chose, par exemple.

$result = false; 
$row = mysql_fetch_array($result, MYSQL_ASSOC); 
// => Supplied argument is not a valid MySQL result resource 

Alors, pourquoi $ result être false? Amost c'est toujours parce que la requête précédente a échoué et qu'il n'y a pas de gestion des erreurs dans le script. Chaque requête peut échouer, il n'y a rien que vous puissiez faire pour empêcher cela. Par conséquent, vous avez toujours besoin d'une sorte de gestion des erreurs afin que votre script n'essaie pas de traiter le résultat quand il n'y en a pas (mais une condition d'erreur). La gestion d'erreur la plus simple consiste à laisser le script s'arrêter dès qu'une erreur survient.

$sql = 'SELECT x,y,z FROM ...'; 
$result = mysql_query($sql, $mysql) or die(mysql_error()); 

mysql_query() retourne false s'il y avait une erreur. Dans ce cas, l'instruction après or est exécutée, c'est-à-dire si la requête échoue, php affichera le dernier message d'erreur de MySQL, puis quittera.
Vous souhaiterez peut-être implémenter une routine de gestion d'erreur plus avancée, bien que ...
lorsqu'un objet PDO est défini sur PDO :: ERRMODE_EXCEPTION, une exception est générée lorsqu'une erreur se produit. C'est un peu plus difficile à manquer que par rapport à une valeur de retour (simple).

edit: ceci est une réécriture complète de la réponse originale. La première suggestion était de regarder la valeur de wait_timeout.

+3

je pourrais être en train de lire ce mal, mais il semble que la valeur par défaut est peut-être 28800 secondes, ce qui est de 8 heures ... si vous exécutez quelque chose sur 8 heures, les scripts PHP peuvent ne pas être votre réponse pour d'autres raisons! –

+0

oops .... "L'argument fourni n'est pas une ressource de résultat MySQL valide" - c'est quelque chose de complètement différent. Permettez-moi de réécrire toute la réponse .... – VolkerK

+0

Merci pour cela. J'ai mysql_query suivi directement par mysql_fetch_assoc. Le script prend actuellement au maximum 10 minutes. – Alex

-1

vous frappez probablement un temps défini par php
Max Execution Time
Set Time Limit

+0

Je ne sais pas - le temps d'exécution maximum est de 1 heure et le script continue de fonctionner sur les erreurs mysql. – Alex

+0

Les deux sont liés à la durée maximale d'exécution du script, l'OP rencontre des difficultés avec les délais d'attente mySQL, le script est toujours en cours d'exécution lorsque la connexion se ferme. –

Questions connexes