• Publicidad

Recargar una página Web al ejecutar un CGI

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Recargar una página Web al ejecutar un CGI

Notapor J.C.M.Castillo » 2006-01-29 15:16 @678

¿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.
J.C.M.Castillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2006-01-13 10:40 @486

Publicidad

Re: Recargar una página Web al ejecutar un CGI

Notapor explorer » 2006-01-29 16:46 @740

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.
  1. 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: Seleccionar todo
    <meta http-equiv="refresh" content="2;url=http://mi.servidor.com/cgi-bin/programa_de_consulta.pl">
  2. 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.
  3. 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.
  4. 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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor J.C.M.Castillo » 2006-01-30 14:39 @652

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.
J.C.M.Castillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2006-01-13 10:40 @486

Re: Recargar una página Web al ejecutar un CGI

Notapor explorer » 2006-01-30 15:29 @686

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.[/list1a]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).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor J.C.M.Castillo » 2006-01-30 16:00 @708

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.
J.C.M.Castillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2006-01-13 10:40 @486

Re: Recargar una página Web al ejecutar un CGI

Notapor explorer » 2006-01-30 16:18 @721

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).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Recargar una página Web al ejecutar un CGI

Notapor explorer » 2006-01-31 15:16 @677

Lo que son las cosas...

HOY acaba de salir un módulo que te va como anillo al dedo... aunque claro... con Ajax...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor J.C.M.Castillo » 2006-01-31 15:18 @679

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.
J.C.M.Castillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2006-01-13 10:40 @486

Re: Recargar una página Web al ejecutar un CGI

Notapor explorer » 2006-01-31 15:37 @693

J.C.M.Castillo escribiste: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 escribiste: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
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor J.C.M.Castillo » 2006-02-01 15:50 @701

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: Seleccionar todo
open (ARCHIVO, '>>nombre.txt') ;
until(...........) {
....
         read (ARCHIVO, $contenido, 200);
...      
}


Segundo CGI con el que borro el archivo:
Código: Seleccionar todo
....
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
J.C.M.Castillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2006-01-13 10:40 @486

Siguiente

Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados