Voy a hacer referencia a una extensión de Yii que puede resultar muy útil: runactions

Permite lanzar los Actions de los controladores en diferentes contextos. Ejecutar tareas en segundo plano, configurar cron jobs, lanzar procesos mediante una Url tanto localmente como remotamente, y otros usos similares que se pueden configurar de distintas maneras.

Puede ocurrir que en un mismo action se quiera realizar algo de lo que no depende la salida que se le muestra al usuario, como puede ser el envío de mails con adjuntos pesados. En estos casos, para no obligar al usuario a esperar más de lo necesario, podemos realizar estas tareas en segundo plano.

[php]

public function actionTimeConsumingProcess()
{
if (ERunActions::runBackground())
{
//realizar todo lo que queramos en segundo plano.
//El usuario no tiene que esperar a que esto termine
}
else
{
//código que se ejecuta inmediatamente como siempre
}
}

[/php]

También puede resultar muy útil el poder lanzar procesos mediante una url sin tener que esperar a que éstos terminen. Para esto podemos usar lo siguiente:

[php]
ERunActions::touchUrl($url,$postData=null,$contentType=null);
[/php]

Para probar esto podemos lanzar en segundo plano una acción que esciba en un log tras esperar unos segundos:

[php]

public function actionSegundoPlano()
{

$horaIni = date(‘h:i:s’);
sleep(10);
$horaFin = date(‘h:i:s’);

$mensaje = $horaIni.’ -Esto es una prueba- ‘.$horaFin;

$level = ‘info’;
$category = ‘system.web.CController’;

Yii::log($mensaje,$level ,$category);

}

[/php]

La acción anterior se lanzaría al llamar nosotros a la url correspondiente a la siguiente acción que podría esta en el mismo servidor o en otro distinto.

[php]

public function actionTestUrl()
{
$url = ‘http://localhost/yii/yiiproject/index.php?r=site/segundoPlano’;
ERunActions::touchUrl($url);
echo “Se ha lanzado el proceso en segundo plano”;
}

[/php]

Si ponemos en un navegador http://misitio/controlador/testUrl se nos mostrará inmediatamente el mensaje “Se ha lanzado el proceso en segundo plano” y posteriormente, pasados los 10 segundos especificados en la acción anterior, se escribirá en el log.

Aprovecho este ejemplo para hacer referencia a la función de Logging que posee Yii.

Los mensajes se pueden registrar de 2 maneras:

[php]
Yii::log($message, $level, $category);
Yii::trace($message, $category); //éste sólo funciona en “debug mode”
[/php]

Hay que especificar la categoría y el nivel del mensaje que se quiera registrar en el log.

Category (categoría): string con formato xxx.yyy.zzz que constituye el alias del path dónde se encontrará el fichero .log.

Level (nivel): indica el tipo de mensaje que se va a registrar (trace, info, profile, warning, error)

En el ejemplo hemos especificado lo siguiente:

$level = 'info';
$category = 'system.web.CController';

Con la configuración que tenemos de CLogRouter en config/main.php  indicamos que los mensajes del ejemplo, que son de nivel “info” (informativos), se van a registrar en el fichero .log cuya ruta viene dada por la categoría, es este caso / protected / runtime / application.log

CLogRouter gestiona el enrutamiento de los logs. Hay varias clases disponibles que permiten mostrar los logs en diferentes medios:

  • CDbLogRoute: guarda los mensajes en la base de datos.
  • CEmailLogRoute: envía los mensajes por correo.
  • CFileLogRoute: registra los mensajes en un fichero bajo el directorio /protected/runtime
  • CWebLogRoute: muestra los mensajes al final de la propia página web.
  • CProfileLogRoute: hace lo mismo que el anterior pero con los mensajes de nivel profile.

En el caso de nuestro ejemplo tenemos configuradas 3 modalidades de logs:

  1. Registro en ficheros de los mensajes informativos cuya categoría esté bajo “System”. Éste es el modo que hemos usado antes para escribir en el log tras unos segundos y así verificar la acción en segundo plano.
  2. Envío por correo de los errores y warnings.
  3. Visualización de trazas en la propia página web. Esta opción es para mostrar los mensajes al final de la página, pero aquí se ha activado ‘showInFireBug’ lo que hace que se muestren en la consola de Firebug. Esto puede resultar muy útil para depurar.

[php]
‘log’=>array(
‘class’=>’CLogRouter’,
‘routes’=>array(
array(
‘class’=>’CFileLogRoute’,
‘levels’=>’info’,
‘categories’=>’system.*’,
),
array(
‘class’=>’CEmailLogRoute’,
‘levels’=>’error, warning’,
‘emails’=>’correoejemplo@mail.com’,
),

array(
‘class’=>’CWebLogRoute’,
‘levels’=>’trace’,
‘categories’=>’vardump’,
‘showInFireBug’=>true
),
),
),
[/php]

One Reply to “Runactions & Logging – Yii”
  1. Estoy desarrollando una aplicación web y necesito configurar el filtro de CDbLogRoute para que me escriba en una base de datos todos los eventos que ocurren en la aplicación, o sea, todas las acciones que realicen los usuario sobre los datos.

Deja un comentario

*