2010-08-20 12 views
3

Existe-t-il un moyen de forcer Mysql de PHP à tuer une requête si elle n'est pas retournée dans un certain laps de temps?Forcer le délai d'attente sur une MysqlQuery à partir de PHP

Je vois parfois des requêtes coûteuses s'exécuter pendant des heures (évidemment, à ce moment, la connexion HTTP a expiré ou l'utilisateur est parti). Une fois que suffisamment de telles requêtes s'accumulent, cela commence à affecter gravement les performances globales.

+2

Woah, requête jamais vue qui dure pendant des heures ... – jolt

Répondre

4

Les requêtes longues sont un signe de mauvaise conception. Il est préférable d'inspecter les requêtes en question et comment elles pourraient être optimisées. Ce serait simplement ignorer le problème.

Si vous voulez toujours cela, vous pouvez utiliser la commande SHOW PROCESSESLIST pour obtenir tous les processus en cours. Et puis utilisez KILL x pour tuer une connexion client. Mais pour que cela fonctionne, vous devez vérifier cela à partir d'un autre script PHP puisque le multithreading n'est pas encore possible. Aussi, il n'est pas conseillé de donner aux utilisateurs utilisés par les subventions PHP pour jouer avec les paramètres du serveur.

+0

Je pensais à la mise en place de certaines propriétés de connexion. Je connais bien SHOW PROCESSLIST et KILL. J'espérais quelque chose de plus agréable – Ghostrider

1

Avertissement: Le comportement prévu devrait maintenant être utilisé avec quelque chose comme upstart.

Vous voulez créer DAEMONS pour ce genre de chose mais vous pouvez aussi utiliser cron.
Juste avoir un script en regardant les intervalles définis pour les requêtes au-dessus de xyz time et les tuer.

// this instruction kills all processes executing for more than 10 seconds 
SELECT CONCAT('KILL ',id,';') 
FROM INFORMATION_SCHEMA.PROCESSLIST 
WHERE state = "executing" AND `time` >= 10 

Toutefois, si les requêtes sont en cours d'exécution pour si longtemps ... ils doivent être optimisés. D'autre part, vous essayez peut-être d'administrer un serveur partagé et il peut y avoir des utilisateurs malveillants. Sur ce scénario, vous devez spécifier dans les conditions de service que les scripts seront surveillés et désactivés et c'est exactement ce qui devrait être fait pour les plus offensifs.