2006-01-29 15:16 @678 |
|
|
J.C.M.Castillo
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.
|
2006-01-29 16:46 @740 |
|
|
 |
explorer
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.
|
2006-01-30 14:39 @652 |
|
|
J.C.M.Castillo
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.
|
2006-01-30 16:00 @708 |
|
|
J.C.M.Castillo
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.
|
2006-01-31 15:16 @677 |
|
|
 |
explorer
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...
|
2006-01-31 15:18 @679 |
|
|
J.C.M.Castillo
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.
|
2006-01-31 15:37 @693 |
|
|
 |
explorer
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
|
2006-02-01 15:50 @701 |
|
|
J.C.M.Castillo
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
|
2006-02-02 11:16 @511 |
|
|
 |
macgregor
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]
|
2006-02-03 01:11 @091 |
|
|
J.C.M.Castillo
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
|
|
Página 1 de 1
|
[ 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
|
|
Socializa |
 |
|