Maison  >  Article  >  base de données  >  Pourquoi ma requête MySQL expire-t-elle après 60 secondes, même si le « wait_timeout » est beaucoup plus élevé ?

Pourquoi ma requête MySQL expire-t-elle après 60 secondes, même si le « wait_timeout » est beaucoup plus élevé ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-27 05:07:13301parcourir

Why is my MySQL query timing out after 60 seconds, even though `wait_timeout` is much higher?

Le serveur MySQL a disparu - à 60 secondes de ce qui était attendu

Cet article explique ce qui a poussé le serveur MySQL à effectuer une requête qui a duré 120 secondes. Problème qui expire après 60 secondes et génère une erreur. Bien que la requête fonctionnait correctement, un problème dans le script PHP a provoqué cette erreur.

Symptômes du problème

  • Exécution de la requête via PHP SELECT SLEEP (120) ; expire après 60 secondes.
  • L'exécution de la même requête à partir du client MySQL s'exécute avec succès.
  • Le délai d'expiration est fixe de 60 secondes à chaque fois, ce qui suggère qu'il peut s'agir d'un problème de configuration plutôt que d'une limite de ressources.

Configuration du système

  • Windows Server 2003
  • MySql 5.1.36-communauté
  • PHP 5.3

Analyse

Après avoir vérifié la sortie SHOW VARIABLES, nous avons constaté que wait_timeout a été défini sur 28800 (480 minutes), mais l'erreur existe toujours. Cela montre que wait_timeout n'est pas le problème.

Solution

La cause du problème est l'option PHP mysql.connect_timeout. Cette option est utilisée non seulement pour les délais de connexion mais également pour attendre la première réponse du serveur. Étant donné que la durée de la requête est définie sur 120 secondes et que mysql.connect_timeout est défini sur 60 secondes par défaut, le serveur ferme la connexion après 60 secondes, provoquant l'erreur.

Résolu ce problème en augmentant mysql.connect_timeout à au moins 120 secondes. Ceci est réalisé avec le code suivant :

ini_set('mysql.connect_timeout', 300);
ini_set('default_socket_timeout', 300); 

Cela augmente mysql.connect_timeout à 300 secondes, évitant ainsi de fermer prématurément la connexion en attendant la réponse du serveur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn