Instalar eAccelerator o Cache de PHP

PHP no es un lenguage compilado sinó un lenguage interpretado, (comunmente conocido como un lenguage de scripts), esto quiere decir que está diseñado para ser ejecutado mediante un interprete; por cada petición, este interprete tiene que leer cada archivo PHP, evaluar su sintaxis, interpretarlo (compilarlo) y ejecutar su funcionalidad. Como verás todo este trabajo tiene un costo alto en CPU y según el tráfico del sitio se traduce en una sobrecarga del mismo.

Para solucionar esto podemos acceder a varios sistemas de Cache, de forma que cuando desde el browser se realiza una petición, estos sistemas acceden al caché de nuestro script que ya fue leído, evaluado he interpretado (compilado) en una solicitud anterior, sin necesidad de volver a realizar el trabajo nuevamente. De esta manera obtenemos mejoras en el rendimiento del servidor y un incremento de velocidad que puede ser de hasta 10 veces más rápido. Vale aclarar que si bién se reducirá el consumo de CPU habrá un incremento de uso de memoria (minimo dependiendo del servidor y su uso) donde trabajan estos sistemas de Cache.

Para utilizar cache de PHP no necesitamos modificar nuestros scripts, ya que se instalan como extensiones de PHP. Los sistemas más utilizados son ionCube, PHP eAccelerator, Zend Optimizer (Pago), etc.

En este Post nos centraremos en explicar el uso de Cache con PHP eAccelerator.

eAccelerator nació en diciembre de 2004 como una derivación del proyecto de la MMCache Turck. Turck MMCache fue creado por Dmitry Stogov y gran parte del código eAccelerator todavía se basa en su trabajo.

eAccelerator guarda los scripts PHP compilados en la memoria compartida y ejecuta el código directamente de ella. Se crea bloqueos sólo por un corto tiempo, mientras que se realiza la búsqueda de un script PHP compilado en el cache, por lo que un script se pueden ejecutar simultáneamente por varios motores. Solamente los archivos que no caben en la memoria compartida se guardan en caché de disco.

eAccelerator todavía en desarrollo y disponible en su última versión 0.9.6.1.1

Instalar PHP eAccelerator

Asumimos que no está instalado en nuestro servidor. Podemos consultar si está instalado o no creando en nuestro dominio un archivo con la siguiente sintaxis.

#creamos el archivo info.php
touch /var/www/midominio/info.php

Abrimos el archivo que creamos previamente con un editor, por ejemplo VIM y le agregamos el siguiente contenido.

<?php
phpinfo();
?>

Ahora para ver si está instalado ejecutamos el archivo recién creado en nuestro dominio y chequeamos que no se mencione eAccelerator en ninguna parte.
Sigue leyendo

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'];

Cambiar TimeOut de phpmyadmin

Para aquellos que al trabajar usando phpmyadmin y les es molesto el timeout que trae configurado por defecto, les dejo una forma sencilla de cambiar el mismo.
Aclaro que esto solo es recomendable para ambientes de desarrollo, para producción es mejor dejarle el que trae por defecto o incluso bajarlo.

Editar el archivo config.inc.php que se encuentra en la raiz de phpmyadmin y agregarle las siguientes declaraciones.

//File: config.inc
$cfg['LoginCookieValidity'] = 86400; // Tiempo expresado en segundos

//Tambien podemos definir la cantidad de registro por pagina (Listado de filas de una tabla).
//File: config.inc
$cfg['MaxRows'] = 100;

Recalco que lo más probable es que esta definición no este en este archivo para cambiarla, sino que hay que agregar estas lineas después de los includes.
Lo que haríamos es re-declarar las variables con el nuevo valor.

Añadir botón +1 de Google en Joomla

Para añadir el botón +1 de Google en Joomla solo tenemos que escribir el siguiente codigo en nuestra web Joomla, puede ser en la home, en un componente, en un listado, etc.

//Agregamos la llamada al script de google en el Head del documento.
$document = & JFactory::getDocument();
$document->addScript("https://apis.google.com/js/plusone.js");
$document->addScriptDeclaration("{lang: 'es'};");

//Y en el cuerpo del documento, agregamos el siguiente código donde queramso poscicionar el botón +1 de Google
<g:plusone href="<?=$UrlYourPost?>"></g:plusone>  

Por difrentes tipos de botones consultar la Referencia de Google