Foros del Web » Programando para Internet » PHP »

[Cancelar Ejecución de un Script]

Estas en el tema de [Cancelar Ejecución de un Script] en el foro de PHP en Foros del Web. Wenas! Me ha surgido una nueva duda en mi aplicación. Tengo determinados scripts (por ejemplo los que se conectan a directorios locales y/o remotos para ...
  #1 (permalink)  
Antiguo 08/12/2004, 06:02
Avatar de redlor  
Fecha de Ingreso: noviembre-2004
Ubicación: Sevilla
Mensajes: 42
Antigüedad: 19 años, 5 meses
Puntos: 0
[Cancelar Ejecución de un Script]

Wenas! Me ha surgido una nueva duda en mi aplicación. Tengo determinados scripts (por ejemplo los que se conectan a directorios locales y/o remotos para descargar archivos del servidor o ftp) que tardan mucho en ejecutarse, normalmente incluso más de 1 minuto si el nº de archivos es elevado.

Me gusaría darle al usuario la opción de cancelar la ejecución por ejemplo de una de estas búsquedas pesadas en servidores ftp o accesos costosos a la BD...

Tal como lo tengo ahora mismo, un botón javascript 'CANCELAR' que te lleva a otra página (javascript:document.location="...php"), no surge efecto ya que hasta que no finaliza la ejecución no te conduce a ella.

Mi pregunta es esa por tanto: Cómo meter un botón CANCELAR (button) que finalice la ejecución de un script y me conduzca a la página anterior o algo así?

Espero haber explicado mi problema con claridad.
Muchas gracias, chao.
  #2 (permalink)  
Antiguo 08/12/2004, 17:10
Avatar de redlor  
Fecha de Ingreso: noviembre-2004
Ubicación: Sevilla
Mensajes: 42
Antigüedad: 19 años, 5 meses
Puntos: 0
Por favor, alguien puede echarme una mano con este tema??
  #3 (permalink)  
Antiguo 09/12/2004, 07:02
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Tal como lo tengo ahora mismo, un botón javascript 'CANCELAR' que te lleva a otra página (javascript:document.location="...php"), no surge efecto ya que hasta que no finaliza la ejecución no te conduce a ella.
Eso es completamente normal .. PHP se ejecuta en el servidor .. genera toda su salida en un "buffer" y cuando termina entrega su "salida" al cliente .. En tu caso tu salida es ese javacript que ante tal evento lanzas ese javascript que indica al mismo "navegador" que "cambie" la página por otra que tu indicas.

Cita:
Mi pregunta es esa por tanto: Cómo meter un botón CANCELAR (button) que finalice la ejecución de un script y me conduzca a la página anterior o algo así?
En PHP tienes funciones para controlar el buffer de salida .. es decir, podrías forzar a PHP a que "entrege todo lo que tenga en el buffer" (parece un "asalto xD") a cada iteracción de tu bucle por ejemplo que obtiene esos N archivos ...

La función en concreto sería un: flush() despues de tu echo "algo" .... Pero, eso te va a ocasinor un efecto no muy "grato" de ver en el "cliente" .. a cada pasada de tu bucle se va a imprimir en el navegador ese "botón" y así uno tras otro hasta que finaliza tu rutina. Para evitar ese "detalle" tendrías que entrar a manejar algún evento en javascript o algo así.. y no sería muy "instantaneo" que el "botón" detecte que se ha pulsado entre uno y otro que se "genera". Tendrías que probarlo.

Lo otro que puede controlar PHP es definir una función que se ejecute hasta que termine este independiente de que el cliente cancele el script (cierre la ventana) a la "fuerza".

Concretamente .. la función es:
register_shutdown_function()
www.php.net/register_shutdown_function

Por mi parte la uso sobre todo para lanzar procesos tipo "enviar e-mails" (unos cuantos) .. dejo a PHP que termine cuando termine. El cliente queda liberado rápidamente. Por "desgracia" no hay comunicación "directa" entre esa función y tu "cliente" .. pero si usas otros médios de almacenamiento tipo "hacer un log en un archivo de texto plano .. o esa misma BD que vas llenado con tus datos de ese proceso" y lo lees .. podrías hasta "ver el progreso" de tu proceso. No sé hasta que punto cancelar la ejecución de esa función que se registró ... revisa en ese tema de esas funciones hay algunas más que te podrían servir.

Un saludo,
  #4 (permalink)  
Antiguo 09/12/2004, 16:15
Avatar de redlor  
Fecha de Ingreso: noviembre-2004
Ubicación: Sevilla
Mensajes: 42
Antigüedad: 19 años, 5 meses
Puntos: 0
Sigo sin cancelar..

Wenas Cluster, agradezco de nuevo tu interés por mi tema. He estado investigando, la verdad es que no demasiado, lo q mi trabajo me ha permitido, sobre estas funciones.
La veradad es q no las conocía y me creo q las voya a applicar en algunos de mis scripts. Por ejemplo, hago accesos a servidores ftp q tardan mucho tiempo, por lo que creo que despues de analizar un nivel de directorios ya podría imprimir sus archivos con un flush().

Bueno, despues del comentario.. de todas formas ambas unciones por lo q he entendido se centran en devolver lso resultados hasta un determinado punto de ejecución, flush, o en en el caso de las segunda, en ejecutar un script de forma trasparente al usuario. Pero en mi caso yo no quiero resultados, simplemente qiero matar al proceso en medio de una ejecución.

Supongamos un usaurio q haya seleccionado 20 ficheros de una lista de archivos ftp, que yo tengo q descargar (ftp_get) y copiar en un temporal. Pues dependiendo del tamaño tarda más o menos, lo normal es que te "mueras de asco" esperando a q finalice la ejecución del script de descarga y copia de archivos. Si se aburre demasiado le qiero dar la posibilidad de abortar la descarga (ya digo q puede durar varios minutos o incluso "tirar algún q otro servidor ftp... "). A eso me refería a cómo matarlo. Había pensado en un botón javascript, pero no se cómo asociarle una acción php sin mandarlo a otra página y claro si tengo q esperar a q finalice la descarga... Vamos ni siqiera tengo una idea de qué función php usar pra matarlo......


Bueno seguiré investigando, espero haber expuesto claramente mi prolema. Si tienes alguna otra idea, la agradecería. Gracias por colaborar.

Última edición por redlor; 09/12/2004 a las 16:27
  #5 (permalink)  
Antiguo 10/12/2004, 05:58
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues .. como ya te he comentado .. el tema de cancelar un proceso así no se puede (por lo menos hasta donde yo sé ... sigo a la espera de alguna solución).

Ten presente que PHP es un lenguaje "del lado del servidor" y actual com "cliente-servidor" .. es decir .. tu "le pides" este procesa y te entrega su resultado .. no hay "comunicación" directa entre el cliente y el servidor cuando el servidor está procesando algo salvo que hagas algo tipo las técnicas de "flush" o alguna similar que "libere" al cliente para que pueda atender a tu petición.

Un saludo,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:01.