Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » Recargar una página Web al ejecutar un CGI Responder al tema
Nuevo tema


Página 1 de 1  [ 12 mensajes ] 
 
Nota 2006-01-29 15:16 @678

Perlero Nuevo
Registrado: 2006-01-13 10:40 @486
Mensajes: 16
Recargar una página Web al ejecutar un CGI
¿Existe alguna forma para recargar una página web al ejecutar un CGI?.
No he visto nada por ahí, pero se ma había ocurrido hacerlo en JavaScript. Imagino que tendré que instalar algún módulo, pero ¿cuál?.

Necesito hacer esto ya que ejecuto un bucle en Perl y quiero que me actualice el contenido de la página WEB cada vez que se ejecuta una parte del bucle.


Nota 2006-01-29 16:46 @740
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
No puedes. Quiero decir que una página sí puede pedir ser recargada, pero no si se lo intentas decir desde el exterior.
Esto se resolvía hace años con la tecnología "push" del http, pero desconozco si los navegadores actuales todavía lo soportan. Es muy posible que el Firefox 1.5 todavía lo mantenga...
Hay varias formas para resolver el problema. Ahí van unas cuantas.
    Tienes un programa que se está ejecutando en el servidor. Este programa está en un bucle muy largo o es un sin fin. Lo que haces es que dentro de este bucle, grabas la información que quieras mostrar en ficheros o bases de datos externas al programa. Luego, creas una página web en la cual tengas puesto que haga una recarga automática pasados unos segundos (poniendo el meta refresh):
    Código:
    <meta http-equiv="refresh" content="2;url=http://mi.servidor.com/cgi-bin/programa_de_consulta.pl">

    En este ejemplo, la página se refresca cada 2 segundos, y, opcionalmente, le indicas la url de la página que quieres que recargue. En este caso, un cgi que se encargará de mostrar la información generada por el primer programa.
    Otra opción es usar las nuevas tecnologías Ajax. Para ello tienes que tirar de Javascript, pero al final tienes que crear algo muy parecido a la primera opción. Introducción aquí Mastering Ajax, Part 1 y aquí Mastering Ajax, Part 2. Si utilizas Perl, recuerda que el soporte para Ajax te lo da el módulo CGI::Ajax. Esta es la página ideal para resolver el problema.
    Otras formas pasan por tener en la página un "visor" o "monitor de estado" de ejecución del programa en el servidor. Esto lo puedes hacer con un Flash o con un Applet de Java. Estos subprogramas mantendrían abierto un canal de comunicaciones con el servidor y recibirían las peticiones de visualización de los datos.
    La forma más sencilla. Supongamos que tu programa NO se ejecuta de continuo, sino que, en cada recarga, sólo se ejecuta una parte del bucle. Bueno, pues lo tienes resuelto así: haces que el programa que genera la página incluya una cabecera meta como la que ves más arriba, pero sin necesidad de indicar la URL de destino. De esa manera el cliente web llama a la misma página siempre. En el cuerpo de la página, incluirás el último "estado" de ejecución del programa, por ejemplo, en campos ocultos (hide) de un formulario (form). De esa manera, cuando se recargue la página, tu programa, leyendo esos campos, sabrá en que estado de la ejecución se encuentra. Y responde cambiando el cuerpo de la página según ese estado. Si resulta que ha llegado al final de la ejecución, en la cabecerá ya no incluirá el "meta refresh" y la página terminará de recargarse.


Nota 2006-01-30 14:39 @652

Perlero Nuevo
Registrado: 2006-01-13 10:40 @486
Mensajes: 16
Gracias de nuevo Explorer por tu consejos, otra vez...
He probado lo de el Meta Refresh y bien... No es exactamente lo que yo quería, pero de momento me puedo apañar.
Lo de utilizar las tecnología Ajax, ya es otra historia. Me lo tomaré con mas calma y veré que puedo hacer.
Por cierto, ya puestos, ¿se puede detener un bucle sin fin que se ha lanzado en un CGI si se carga otro archivo CGI? O mejor aun ¿se puede detener la ejecución de un bucle con un botón de un formulario en una página WEB?

un saludo y lo dicho, gracias otra vez.


Nota 2006-01-30 15:29 @686
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Para detener a un programa, necesitas: [list1a]O ejecutas otro programa (cgi) que lo pare matándolo (KILL) o enviándole una señal (KILLINT) o des/activando alguna bandera compartida por System V (IPC) o base de datos o fichero de bloqueo (flock).
O el programa se para porque se cumple alguna condición de parada, bien sea por tiempo o por indicación de otro programa, por alguno de los medios anteriores.[/list:u1a]En el bucle sin fin debes comprobar si el programa debe terminar o seguir.

Hay que recordar que el protocolo http está orientado a la petición/servicio de datos y no a la sesión. La comunicación tcp se mantiene sólo el momento necesario para el intercambio de la petición de datos por parte del cliente y el servicio de los datos por parte del servidor. Y se corta. Si quieres mantenerlo abierto, debes usar un verdadero servicio cliente/servidor. La mayor parte de las veces esto se resuelve con un applet de Java que mantiene una conexión con el programa servidor a través de un determinado puerto tcp.

Otras opciones es no usar el http para nada. Haces que el usuario se baje un programa que tu has hecho, que lo ejecute y ya estará conectado permanentemente al servidor (a tu programa servidor).


Nota 2006-01-30 16:00 @708

Perlero Nuevo
Registrado: 2006-01-13 10:40 @486
Mensajes: 16
Uff!
Me parece que me falta mucho por aprender.
Entoces que me recomiendas. ¿Me meto con Java y dejo Perl? o aprendo un poco de cada.


Nota 2006-01-30 16:18 @721
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
TODO se puede hacer con Perl.

No importa si es un cgi que se va recargando cada dos segundos o un programa interactivo hecho en wxwidgets que se conecta al servidor por un puerto tcp.

Lo siento, J.C., pero desde que he visto la luz, ya no soy imparcial. Te diré que el poco Java que aprendí hace un montón de años (10), se me está olvidando (gracias a Dios).


Nota 2006-01-31 15:16 @677
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Lo que son las cosas...

HOY acaba de salir un módulo que te va como anillo al dedo... aunque claro... con Ajax...


Nota 2006-01-31 15:18 @679

Perlero Nuevo
Registrado: 2006-01-13 10:40 @486
Mensajes: 16
Bien, de momento creo que me quedo con Perl. De todo lo que he leido por ahí, para mi objetivo, controlar "cacharros" electrónicos de forma remota, es lo que más me gusta. Eso si, tengo que montones de dudas que espero que los Gurus de este foro me puedan resolver.
Por cierto, soy incapaz de detener un bucle con otro CGI o a través de un evento en un formulario sobre una página WEB. Si que puedo pararlo si se cumple una condición determinada con un tiempo o un contador, pero no cuando yo lo desee de forma manual. Tampoco se como hacer eso del KILL o del KILLINT. ¿no será sólo para Linux? Yo utilizo windows.

En otro orden de cosas me gustaría preguntar: ¿Cual es el módulo más adecuado para crear interfaces gráficos en windows?
He visto que hay varios, pero no se cúal es que más me interesa.


Nota 2006-01-31 15:37 @693
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
J.C.M.Castillo escribió:
Por cierto, soy incapaz de detener un bucle con otro CGI o a través de un evento en un formulario sobre una página WEB. Si que puedo pararlo si se cumple una condición determinada con un tiempo o un contador, pero no cuando yo lo desee de forma manual. Tampoco se como hacer eso del KILL o del KILLINT. ¿no será sólo para Linux? Yo utilizo windows.
En condiciones "normales" valdría el "truco" de que el programa sin fin consulte la existencia o no de un determinado fichero (llamado flag, bandera o semaforo). Si el fichero existe, sigue corriendo. El otro programa que activas desde el web, entonces, lo único que tiene que hacer para parar el primer programa es borrar ese fichero bandera.

J.C.M.Castillo escribió:
En otro orden de cosas me gustaría preguntar: ¿Cual es el módulo más adecuado para crear interfaces gráficos en windows?
He visto que hay varios, pero no se cúal es que más me interesa.
Hay varias opciones. Están el Tk, el Gtk, el Qt y el que quizás sea el mejor, el wxwidgets. Todos te permiten hacer programas gráficos que luego son fáciles de ejecutar en otros sistemas operativos más estables. Seguro que hay alguno por este foro que te puede aconsejar mejor que yo.

Te recomiendo la lectura de la rama Win32:: de Perl. Encontrarás cosas muy útiles. Por ejemplo, con Win32::Process podrás controlar la creación y muerte de procesos.

Actualización: Otro entorno GUI: Prima.


Última edición por explorer el 2006-02-03 15:06 @671, editado 1 vez en total

Nota 2006-02-01 15:50 @701

Perlero Nuevo
Registrado: 2006-01-13 10:40 @486
Mensajes: 16
Qué nada, que no soy capaz de parar el bucle de ninguna manera.
Desde un CGI he creado un archivo. Luego en el bucle le he dicho que lo lea. y Desde el otro CGI digo que borre el archivo, pero esto último no ocurre si se está ejecutando el bucle. Si ejecuto el primer CGI sin bucle si que funciona, pero yo lo que quiero es parar el bucle.

Primer CGI con el que se abre y se crea el archivo:
Código:
open (ARCHIVO, '>>nombre.txt') ;
until(...........) {
....
         read (ARCHIVO, $contenido, 200);
...      
}


Segundo CGI con el que borro el archivo:
Código:
....
unlink("nombre.txt");
....


¿Es esto lo que me decías en tu anterior mensaje?
Dime en que fallo, me tiene desesperado.

_________________
_____________________________
Utilizo Windows con ActivePerl 5.8.7


Nota 2006-02-02 11:16 @511
Avatar de Usuario
Perlero Nuevo
Registrado: 2004-12-09 07:32 @355
Ubicación: españa
Mensajes: 78
si el fichero esta siendo utilizado no te dejara borrarlo.

asi que para que el truco te funcione crea un fichero vacio, no uses el que tiene datos y no lo habras. Consulta solamente si existe y desde el otro proceso lo borras.
Eso hara que el primer cgi termine.

Tu bucle "infinito" tiene que ser parecido a esto:
Código:
my $condicion=1;
while ($condicion)
{
   if (-e "$archivo")
          {el codigo que se tiene que ejecutar en cada iteracion}
   else
          {$condicion=0;}
}


se nota que los booleanos no me gustan?? jejeje.
Es una mania personal.

Espero que te sirva mi propuesta.

PD: por si alguien no lo sabe... 0 == falso. el resto de numeros == cierto.

_________________
MACGREGOR [TM]


Nota 2006-02-03 01:11 @091

Perlero Nuevo
Registrado: 2006-01-13 10:40 @486
Mensajes: 16
Muchísimas gracias.
Ahora si que funciona.

_________________
_____________________________
Utilizo Windows con ActivePerl 5.8.7


Responder al tema  [ 12 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO