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

Con el presente script, monitoreamos los procesos MySQL que están en estado SLEEP por un tiempo mayor al configurado como aceptable.  Si encontramos un proceso que cumpla con esta regla lo eliminamos con la sentencia KILL ProcessID de MySql.

  1. Copiar el código en un archivo
  2. Darle permiso de ejecución
  3. Configurar datos de conexión MySql y notificación por e-mail.
  4. Crear un usuario que tenga permisos sobre las tablas que queremos trabajar
  5. Agendar la ejecución del script en el sistema.
$mysql_host = "127.0.0.1";
$mysql_user = "system";
$mysql_pass = "12345";

//Definimos el tiempo limite para una query en sleep in seconds
$mysql_query_sleep_limit = 250;

//Definimos contra que comando monitorearemos
$mysql_query_name = "Sleep";

//Definimos un array con el usuario/base a monitorear
$mysql_query_user_db_monitoring  = array(
					  array('myusuario','mydb')
					);

//Definimos las variables para el envio de e-mails
$NotifySystemFrom 	= "script-monitoring@mydominio.com";
$ArrNotifySystemTo 	= array("soporte@mydominio.com","otro@mydominio.com");
$NotifySystemSubject	= "Notificacion, Queryes in Sleep Killed!";

$SendNotification       = false;

$conn = mysql_connect($mysql_host,$mysql_user,$mysql_pass);

If($conn){
	$result = mysql_query("show full processlist",$conn);
	while( $Record = mysql_fetch_array($result) ){
 		$Ret[] = $Record;
	}
	if(count($Ret)>0){
		$HtmlToMail  = "<table  BGCOLOR='#FFE4B5'>";
		$HtmlToMail .= "<tr bgcolor='#FFD700'>";
		$HtmlToMail .= "<th align='left'>ID		</th>";
		$HtmlToMail .= "<th align='left'>User		</th>";
		$HtmlToMail .= "<th align='left'>Host		</th>";
		$HtmlToMail .= "<th align='left'>DB		</th>";
		$HtmlToMail .= "<th align='left'>Command	</th>";
		$HtmlToMail .= "<th align='left'>Time		</th>";
		$HtmlToMail .= "<th align='left'>State		</th>";
		$HtmlToMail .= "<th align='left'>Info		</th>";
		$HtmlToMail .= "<th align='left'>Action applied	</th>";
		$HtmlToMail .= "</tr>";
	
		while(list(,$val)=each($Ret)){
			if($val['Command'] == $mysql_query_name AND $val['Time']>=$mysql_query_limit AND in_array(array($val['User'],$val['db']),$mysql_query_user_db_monitoring)){
				//Eliminamos la query
				mysql_query("KILL $val[Id]",$conn);
				echo "Se elimina la consulta con ID:$val[Id]\n";
				$HtmlToMail .= "<tr>";
				$HtmlToMail .= "<td> $val[Id]			</td>";
				$HtmlToMail .= "<td> $val[User]			</td>";
				$HtmlToMail .= "<td> $val[Host]			</td>";
				$HtmlToMail .= "<td> $val[db]			</td>";
				$HtmlToMail .= "<td> $val[Command]	        </td>";
				$HtmlToMail .= "<td> $val[Time] 		</td>";
				$HtmlToMail .= "<td> $val[State]		</td>";
				$HtmlToMail .= "<td> $val[Info] 		</td>";
				$HtmlToMail .= "<td> PID Killed 		</td>";
				$HtmlToMail .= "</tr>";
				$SendNotification = true;
			}
		}
		
		$HtmlToMail .= "</table>";
		if($SendNotification){
		   SendMail($HtmlToMail);
		}
	}
}else{
	echo "Unable to connect - Mysql Error: ".mysql_error()."\n";
}

Function SendMail($Body){
    Global $NotifySystemFrom, $ArrNotifySystemTo, $NotifySystemSubject;
    //Definimos el header del mail de notificacion
    $Header = "From: $NotifySystemFrom \r\n";
    $Header .= "Mime-Version: 1.0 \r\n";
    $Header .= "Content-Type: text/html;charset=UTF-8";
    $NotyfyList = implode(",", $ArrNotifySystemTo);
    mail($NotyfyList,"$NotifySystemSubject [".date("d/M/Y H:i:s")."]",$Body, $Header);
}

Corrección a plugin ALO EasyMail para usar plugin WMPL con dominios diferentes

En este caso estamos usando el plugin WPML para manejo multi-idioma,  el mismo nos permite configurar diferentes nombres de dominio para cada idioma.

Cuando instalé el plugins para envío de Newsletter llamado ALO EasyMail y creo, el más practico del mercado y que mejor se adaptó a mis necesidades, detecte que no funcionaba en los dos dominios que tengo, uno para español y otro para ingles.

El problema radicaba en el uso que hace el plugins de Ajax y como Ajax no soporta cross domain para que el plugins funcione con dominios diferentes y sea compatible con las funcionalidades del Plugins de Internacionalización WMPL hay que hacer un cambio para no llamar a los script con URL absoluta.

El problema estaba en la llamada a la función para construir la Url del script Ajax. El cambio que hicimos hace que llame a la Url relativa y no a la Url absoluta del sitio.

Archivo modificado: /wp-content/plugins/alo-easymail/alo-easymail_functions.php

//En líneas 1084 y 1085
//Antes
var alo_em_sack = new sack("<?php echo admin_url() ?>admin-ajax.php");
//Corrección
var alo_em_sack = new sack("<?php echo get_bloginfo('url') ?>/wp-admin/admin-ajax.php");

//En líneas 1190 y 1191 - Estos cambios es sobre funciones JavaScript
//Antes
var alo_em_sack = new sack("<?php echo admin_url() ?>admin-ajax.php" );
//Corrección
var alo_em_sack = new sack("<?php get_bloginfo('url') ?>/wp-admin/admin-ajax.php" );

Estructura de control en una línea u Operador Ternario en PHP

Usando el operador “?:” (o ternario)
La expresión (expr1) ? (expr2) : (expr3) evalúa a expr2 si expr1 se evalúa como TRUE y a expr3 si expr1 se evalúa como FALSE.
A partir de PHP 5.3, es posible dejar de lado la parte media del operador ternario. La expresión expr1 ?: expr3 retorna expr1 si expr1 se evalúa como TRUE y expr3 si es de otra manera.

Nota: Por favor note que el operador ternario es una sentencia, y que no evalúa a una variable, pero si al resultado de una sentencia. Esto es importante saberlo si se desea retornar una variable por referencia. La sentencia return $var == 42 ? $a : $b; en una función con retorno-por-referencia no funcionará por lo que se ha mencionado y una advertencia es generada en versiones posteriores de PHP.

Es recomendable evitar el “apilamiento” expresiones ternarias.

//Asignamos un string a la variable $myVar
$myVar = ($myValue == 10) ? "El valor es 10": "El valor es diferente a 10";

// Otro ejemplo de uso para: Operador Ternario
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];