Eliminar procesos MySQL que están en estado SLEEP por determinado tiempo con PHP

Hola a todos. Hace tiempo que no escribo en el blog, sinceramente la mayoría de las cosas que he estado haciendo no podía hacerlas públicas.
Bien, hoy he decidido publicar un script que me ha sido bastante útil. Este script está pensado para ejecutarse en consola, aunque si a alguien le hace falta es sencillo modificarlo para que funcione en un cronjob que se ejecute cada cierto tiempo y nos elimine esos incómodos procesos “sleep”.Este código comprobará cada x tiempo los comandos “sleep” que se estén ejecutando en tu base de datos (ojo que esto depende de los permisos del usuario) y detendrá los que superen un tiempo de ejecución que le indiquemos.

Para el funcionamiento de este script he usado una clase singleton de conexión a mysql que expliqué en un post anterior.
Este script es bastante básico pero podríamos añadirle notificaciones por email, si lo veis interesante.
Aquí va el código.

//Author: Fernando Rodríguez-Izquierdo Serrano
require_once ("config.php");    //Archivo donde guardo las constantes HOSTNAME,USERNAME, etc..
require_once ("db.Class.php");

$comandoObjetivo = 'Sleep';     //Comando que queremos detener con la ejecución de este script
$tiempoLimite = 15;             //Tiempo máximo de ejecución de un $comandoObjetivo
$segundos = 60;                 //Cada cuanto tiempo se realiza una comprobación 
$db = db::getInstancia(HOSTNAME, USERNAME, PASSWORDDB, DATABASE);
while (TRUE) {
	$query = "show full processlist";
	$result = $db -> dameQuery($query);
	$i=1;
	while ($proceso = mysql_fetch_array($result)) {
		if ($proceso['Command'] == $comandoObjetivo) {
			if($i%2==0) $color = "\033[32m";
			else $color = "\033[31m";
			echo $color.$proceso['Id'] . ' ' . $proceso['Command'] . ' ' . $proceso['Host'] . ' ' . $proceso['Time'];
			if ($proceso['Time'] > $tiempoLimite) {
				$query = "KILL " . $proceso['Id'];
				$db -> dameQuery($query);
				echo " Proceso eliminado";
			}
			echo "\n";
			$i++;
		}
	}
	for($i=1;$i<=$segundos;$i++){
		sleep(1);
		$cuentaAtras = $segundos-$i;
		if($i%2==0) $color = "\033[32m";
		else $color = "\033[31m";
		echo $color."********** SIGUIENTE COMPROBACION EN ".$cuentaAtras." SEGUNDOS ***********\r";
	}
	echo "\n";
}
Se sociable y comparte!

One thought on “Eliminar procesos MySQL que están en estado SLEEP por determinado tiempo con PHP

  1. me función bien muchas gracias por el código

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>