> Manuales > Trabajo con Ajax en PHP utilizando Xajax

Explicamos el plugin de Comet para Xajax, para hacer scripts que hacen uso de Comet en PHP.

Queremos comentar acerca del uso de Comet en PHP, de una manera sencilla, por medio de la instalación de un plugin en el framework Xajax. Este artículo puede darnos una idea de lo que se puede hacer con comet, aunque hay que decir que todavía es una solución que debe rodarse más para que sea realmente sencilla y compatible con diversos entornos, tanto en el cliente como el servidor, por lo menos en el momento de escribir este artículo.

Para la información del lector habría que comentar primero que Xajax es un framework PHP para el uso de Ajax de una manera cómoda, desde scripts PHP. Venimos publicando un Manual de Xajax que convendría leer para saber más sobre el tema.

Además, para los que no sepan qué es Comet cabe decir que es algo así como Ajax, que permite hacer llamadas al servidor sin recargar la página, pero con la diferencia que en Ajax las llamadas para solicitar nuevos contenidos al servidor las inicia el usuario, mientras que en Comet las llamadas para recargar la información de la página las inicia el servidor. Como no tenemos ningún artículo en este momento para explicar Comet en DesarrolloWeb.com, os dejamos el link con la descripción de Comet en la Wikipedia.

Para entender para qué nos sirve esto digamos que, con Xajax y el plugin de Comet, podemos hacer scripts que se ejecutan en el servidor, con PHP, y actualizan repetidas veces la página del cliente con Comet. Estos scripts podrían ejecutarse durante un tiempo indeterminado y de vez en cuando, el servidor podría mandar señales al navegador para que actualice los contenidos de la página que está viendo el usuario, sin que el usuario tenga que intervenir.

Por ejemplo, podemos imaginar una aplicación web de Chat en PHP. Si se hiciera con Ajax podríamos hacer que el cliente llame al servidor cada cierto tiempo para pedir las actualizaciones de la conversación y que estas se muestren en pantalla. El cliente cada poco pedirá de nuevo la información de las conversaciones , para actualizarla, aunque esta información no haya cambiado, provocando llamadas inútiles, que no actualizan ningún dato. En Comet, se podría hacer que el servidor sea el encargado de enviar al cliente, sin que este tenga que solicitar nada, la conversación, sólo en el momento que se ha actualizado. Esto permitiría, entre otras cosas, que sólo se hicieran las conexiones imprescindibles al servidor para actualizar la información.

El autor del plugin de Comet para Xajax incluso dice que ha creado un chat experimental para probar Comet. El problema, como él mismo apunta, es que cada usuario del chat tiene que mantener un proceso de PHP que se ejecuta en el sistema abierto para cada usuario, para poder enviar los datos cuando se actualizan. Dice que cada proceso ocupa bastante memoria en el servidor (10MB) y que contando con los muchos usuarios que puede tener un chat, se puede hacer bastante pesado para ejecutar por la máquina.

Podemos ver el demo de Comet, en su versión 0.2.2 publicada en el momento de escribir este artículo, funcionando en la propia página dentro del sitio de Xajax: http://www.xajax-project.org/developer/q_no/Comet/comet.php

Instalar el plugin de Comet en Xajax

Para instalar un plugin en el framework de Xajax tenemos que copiar en una carpeta especial el código fuente del plugin. Desde la propia página del demo del plugin podremos descargar la última versión.

Los archivos que descargaremos, una vez descomprimidos, los tenemos que colocar en la carpeta xajax/xajax_plugins/response/. Con lo que dentro de esta carpeta tendremos un nuevo directorio llamado "comet" que contendrá el código del plugin.

Pero ATENCIÓN! Supongo que lo cambiarán en breve en la distribución del plugin, pero en el momento de escribir este artículo hay un archivo que está mal y que da un error cuando se ejecuta el demo en Internet Explorer. Es el archivo comet.js, que forma parte de los ficheros del plugin. Sobre Internet Explorer salta un error "context es nulo o no es un objeto". Esto se cambia utilizando otro archivo comet.js que han publicado por ahora sólo en un post del foro de Xajax y dejo en link para descarga desde el servidor de DesarrolloWeb.com.

Con esto el Plugin ya está cargado en el framework, sólo nos queda incluirlo en cada página que lo queramos utilizar. Con este código PHP.

// camino a xajax core
$core = 'xajax/xajax_core';
require_once $core . '/xajax.inc.php';
// creamos el objecto xajax
$xajax = new xajax();
// se incluye el plugin
require_once $core . '/xajaxPlugin.inc.php';
require_once $core . '/xajaxPluginManager.inc.php';
require_once './xajax/xajax_plugins/response/comet/comet.inc.php';

En las funciones de Xajax que utilizan Comet para realizar enviar nuevos datos a la página del cliente, debemos usar xajaxCometResponse en lugar de xajaxResponse. Los datos se envían al navegador cliente, las veces que sean necesarias, con el método flush().

En esta función, que es la misma que la del demo, se hace uso de Comet.

function testComet () {
$objResponse = new xajaxCometResponse(0.3);

for ($i=1;$i<=10;++$i) {
$objResponse->assign("progress","style.width",($i*5)."px");
$objResponse->assign("streaming","innerHTML",($i*5).'%');
$objResponse->flush();
}
$objResponse->assign("progress","style.width",($i*5)."px");
$objResponse->assign("streaming","innerHTML",($i*5).'%');
$objResponse->alert("finished process at ".($i*5)."%.");
return $objResponse;
}

Dificultades que hemos encontrado con el plugin de Comet para Xajax

Lo cierto es que poner el sistema en marcha ha sido bien sencillo y en las pruebas con Firefox ha funcionado a la primera, en mi servidor local. Luego he tenido problemas con Internet Explorer y después de un buen rato buscando he visto que había que cambiar el archivo comet.js que se había proporcionado por otro archivo que dan en el foro (esto lo había comentado antes y había puesto el link al archivo comet.js bueno).

Así que fuera esos problemas, que seguro que estarán resueltos en la próxima versión del plugin, todo ha sido muy rápido y sencillo.

El sistema de Comet para Xajax requiere PHP 5, pero Xajax en si permite tanto PHP 4 como PHP 5. Debido a este juego de versiones, probando el script en otro servidor, he tenido problemas, porque muestra una serie de mensajes de error "Strict Standards", porque Xajax no utiliza PHP 5 estricto. He de decir que en estos momentos, en la versión 0.5 de Xajax, todavía han mantenido compatibilidad con PHP 4 y por ello surge algún problema a la hora de correrlo en PHP 5. Dicen que la próxima versión de Xajax ya sólo soportará PHP 5, e incluso que van a publicar una actualización de Xajax pronto preparada para PHP 5 estricto. Así que cabe esperar un poco para que todo esté listo y funcionando correctamente, al menos en los sistemas con PHP 5. Otra solución momentánea es eliminar la visualización de mensajes de error PHP en las páginas.

En código PHP del uso del plugin de Comet

El código completo del script PHP que sirve de demo de Comet es el siguiente, tomado de la página del autor y modificado en un par de sitios para adecuarlo a nuestro sistema:

<?php
// camino a xajax core
$core = 'xajax/xajax_core';
require_once $core . '/xajax.inc.php';
// creamos el objecto xajax
$xajax = new xajax();
// se incluye el plugin
require_once $core . '/xajaxPlugin.inc.php';
require_once $core . '/xajaxPluginManager.inc.php';
require_once './xajax/xajax_plugins/response/comet/comet.inc.php';

function testComet () {
$objResponse = new xajaxCometResponse(0.3);

for ($i=1;$i<=10;++$i) {
$objResponse->assign("progress","style.width",($i*5)."px");
$objResponse->assign("streaming","innerHTML",($i*5).'%');
$objResponse->flush();
}
$objResponse->assign("progress","style.width",($i*5)."px");
$objResponse->assign("streaming","innerHTML",($i*5).'%');
$objResponse->alert("finished process at ".($i*5)."%.");
return $objResponse;
}

$xajax->register(XAJAX_FUNCTION,"testComet",array("comet" => true));


//procesar peticiones
$xajax->processRequest();
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title>Comet test</title>
<link rel="STYLESHEET" type="text/css" href="<?echo $_SESSION["estilo_css"];?>">
<?
//librerías xajax javascript
$xajax->printJavascript("xajax/");
?>

</head>

<body>
<h1>Hago un test del plugin comet para xajax</h1>

<input type="button" value="pulsa" onclick="xajax_testComet()">
<br>


<div id="progress" style="width:1px;background:red;border:1x solid darkred">
         <div id="streaming"></div>   
      </div>

</body>
</html>

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online Escu...

Manual