Foros del Web » Programando para Internet » PHP »

¿Existe forma de evitar que una página se ejecute más de una vez al mismo tiempo?

Estas en el tema de ¿Existe forma de evitar que una página se ejecute más de una vez al mismo tiempo? en el foro de PHP en Foros del Web. Hola amigos, tengo una página php que contiene scripts que hacen algunos trabajos. Esta página está actualizada por cron a alta velocidad, por eso necesito ...
  #1 (permalink)  
Antiguo 16/03/2010, 19:27
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Pregunta ¿Existe forma de evitar que una página se ejecute más de una vez al mismo tiempo?

Hola amigos, tengo una página php que contiene scripts que hacen algunos trabajos. Esta página está actualizada por cron a alta velocidad, por eso necesito que la página culmine su trabajo para que el cron pueda ejecutarlo nuevamente. No se puede recargar a la vez porque la segunda página necesita de los datos generados de la primera página.

Resumiendo... ¿hay alguna forma que no se ejecute una pagina php mientras esa misma página ya se está ejecutando?

Que la solución tenga que ver directamente con la página o algún script y no regulando la velocidad del cron.

Alguien que pueda ayudarme por favor?
  #2 (permalink)  
Antiguo 16/03/2010, 19:33
Avatar de zerpico_01  
Fecha de Ingreso: enero-2008
Ubicación: Wilde - Avellaneda -
Mensajes: 419
Antigüedad: 14 años, 5 meses
Puntos: 13
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

no me queda claro que precisas

pero tal vez utilizando sessiones y eliminar la session cuando termine la primera y asi lanzar la segunda...

saludos!!
  #3 (permalink)  
Antiguo 16/03/2010, 19:36
 
Fecha de Ingreso: diciembre-2007
Mensajes: 927
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Si es con cron no.

Pero puedes poner una ajecucion infinita, no se si tu servidor te lo permita...

Lo que es, es lo siguiente: al finalizar la funcion, reiniciar la pagina o hacer una funcion general y re-llamar esa funcion.
  #4 (permalink)  
Antiguo 16/03/2010, 20:47
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Cita:
Iniciado por Edig Ver Mensaje
Si es con cron no.

Pero puedes poner una ajecucion infinita, no se si tu servidor te lo permita...

Lo que es, es lo siguiente: al finalizar la funcion, reiniciar la pagina o hacer una funcion general y re-llamar esa funcion.
Hola, yo tengo un vps en knowhost y si no tengo esa funcion de ejecucion infinita me gustaria saber como podria hacer o donde activarlo o configurarlo. Y como haria para rellamar una funcion?

zerpico_01, la página necesito que se recargue totalmente para volver a ejecutar la misma página nuevamente, asi sucesivamente hasta el infinito, pero que sea ordenadamente, osea continuado porque la pagina genera al final un dato que depende la siguiente carga de la misma pagina y asi sucesivamente, espero explicarme bien.

Saludos
  #5 (permalink)  
Antiguo 17/03/2010, 11:48
Avatar de DeeR  
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 18 años, 6 meses
Puntos: 17
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Hola, lo que puedes hacer es utilizar un bloqueo simple, lo mas sencillo es utilizar un archivo como lock, si el archivo existe, quiere decir que el proceso está corriendo y matamos la aplicacion, si no existe, creamos el lock y ejecutamos el proceso y eliminar el lock.

Hay formas mas segurra como verificar que el pid del proceso exista, etc etc etc .. pero el bloqueo simple te puede ayudar.

Te dejo un pequeña clase que lo implementa en Implementación simple de un lock en php

Saludos
  #6 (permalink)  
Antiguo 17/03/2010, 17:41
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Entonces según este código:
Código:
class lock
{
 
 
	var $file;
	var $time_limit = 600;
	function lock( $file )
	{
		if ( !is_writable(dirname( $file  )) )
			die("directory is not writable");
		$this->file = $file;
	}
 
	function exits_lock()
	{
		if ( !is_file( $this->file )  )
		{
			touch( $this->file  );
			return false;
		}
		else
		{
			// Check the time of lock
			[email protected]( $this->file  );
		        if($time && ($time<=(time()- $this->time_limit )))
			{
		                touch( $this->file );
				return false;
 
		        }
		        else
			{
				return true;           		
		        }
		}		
 
	}
 
	function __destruct()
	{
		unlink( $this->file );
	}
 
}

$mylock = new lock("data.lock");
 
if ( $mylock->exits_lock()  )
	die("app running");
 
sleep(5);
En que parte va mi codigo?, me parece al final, corriganme si me equivoco, y como hago para eliminar el look?? al terminar el proceso? y como modificar este código para que no tenga que esperar, sino que simplemente no haga nada ya que el cron es el que se encarga de la ejecución y pienso yo que si se pone a esperar va a "chocar" con los otras ejecuciones que vienen tras el y se sobrecargará el servidor.

Esa parte de: var $time_limit = 600; es lo supongo que hace esperar la ejecucion o el sleep(5);, pero yo no deseo que espere, solo que no haga nada si se encuentra bloqueado, como podria modificar este codigo?

Disculpen si no se mucho de php pues estoy aprendiendo recien ;)

Saludos
  #7 (permalink)  
Antiguo 18/03/2010, 05:30
Avatar de DeeR  
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 18 años, 6 meses
Puntos: 17
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Cita:
Iniciado por Devjunx Ver Mensaje
¿Nadies sabe como arreglar ese código para que no haga nada cuando se está ejecutando la página?
Hola.

Si te das cuentas, el lock se elimina en el destructor de la clase, por ende cuando termine el script y automaticamente se eliminen los objectos, se llama al destructor del objeto.

Lo unico que tienes que hacer es continuar tu codigo en

Código:
if ( $mylock->exits_lock()  )
	die("app running");

// Tu codigo .....
Respecto al time_limit, verifica si el lock tiene mas de 10 minutos, eso quiere decir que el proceso sigue ejecutandose o se quedo pegado, y en mi caso prefiero volver a ejecutar, tu puedes cambiar el limite al tiempo que tu quieras o simplementa que si siempre existe el lock, no se ejecute el proceso.

Saludos.
  #8 (permalink)  
Antiguo 18/03/2010, 07:47
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Hola, me sale esto:
Código:
Warning: unlink(/home/domain/public_html/cron/cron.lock) [function.unlink]: No such file or directory in /home/domain/public_html/cron/cron.php on line 44
la linea 44 es esta:
Código:
unlink( $this->file );
No entiendo porque sale este error cuando lo ejecuto a través del navegador actualizando la página varias veces rapidamente, le di permisos de carpeta ademas; eso es normal o algo tiene el código de mal?
  #9 (permalink)  
Antiguo 18/03/2010, 08:19
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 14 años, 8 meses
Puntos: 5
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Lo q te dice es que la ruta que estás mandando al unlink no es correcta. Verifícalo
  #10 (permalink)  
Antiguo 18/03/2010, 12:48
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Todo lo que puse en esa página está asi:
Código:
class lock
{
	var $file;
	var $time_limit = 600;
	function lock( $file )
	{
		if ( !is_writable(dirname( $file  )) )
			die("directory is not writable");
		$this->file = $file;
	}
	function exits_lock()
	{
		if ( !is_file( $this->file )  )
		{
			touch( $this->file  );
			return false;
		}
		else
		{
			// Check the time of lock
			[email protected]( $this->file  );
		        if($time && ($time<=(time()- $this->time_limit )))
			{
		                touch( $this->file );
				return false;
 
		        }
		        else
			{
				return true;
		        }
		}		
	}
	function __destruct()
	{
		unlink( $this->file );
	}
}

$mylock = new lock("/home/domain/public_html/cron/cron.lock");
 
if ( $mylock->exits_lock()  )
	die("app running");
........scripts.....
No se donde habrá más que configurar, o me falta alguna configuración? tal vez haya alguna variable mas que colocar?
  #11 (permalink)  
Antiguo 18/03/2010, 12:53
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 14 años, 8 meses
Puntos: 5
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

¿Q te devuelve la funcion exists_lock()?
¿Verificaste que el archivo se cree en verdad en el directorio q especificas?
La clase no parece estar mal, solo verificar esto y ¿porq usas sintaxis de php4?
  #12 (permalink)  
Antiguo 18/03/2010, 13:32
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Eulloa, siendo sincero yo no se reconocer si un script esta escrito en php4 o php5 porque no se mucho de php. este script me lo dio a conocer el amigo Deer:

http://deerme.org/articles/view/20-implementacin-simple-de-un-lock-en-php

La funcion exists_lock() ni idea que me devolverá pues no se mucho de php como para probarlo, disculpa mi ignorancia :(, el archivo de crearse si se crea, incluso a veces cuando actualizo funciona normal como deberia de ser apareciendo en la pantalla "app running", pero cuando le actualizo cuando casi tanteo que acabara lo scripts ya de ejecutar la página aparece ese error que describi mas arriba, explicandome de otra manera... si actualizo rapido funciona bien, si me demoro en actualizar hasta un poco antes de terminar la ejecucion me sale ese error y no se porque.

Si usted conoce algun otro código en un formato php5 tal vez le agradeceria mucho que me informara. Se que este codigo funciona bien hasta cierto punto pero de alli "jugando" con las actualizadas comete algunos errores, o le faltara algo para que funcione totalmente bien?

Saludos
  #13 (permalink)  
Antiguo 18/03/2010, 13:40
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 14 años, 8 meses
Puntos: 5
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Cita:
Iniciado por Devjunx Ver Mensaje
si actualizo rapido funciona bien, si me demoro en actualizar hasta un poco antes de terminar la ejecucion me sale ese error y no se porque.
Pues no entiendo, claro q al actualizar la primera vez ejecuta la clase y borra el file, la funcion devuelve true la primera vez. La segunda ya no, pues entrará a crear el file y devolverá FALSE, por tanto no saldrá el app_runing.
¿Dejas q termine la ejecución del script para refrescar la página? Explícame bien esto, nolo entiendo
  #14 (permalink)  
Antiguo 18/03/2010, 14:41
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Le explico, se supone que el script no debe dejarme ejecutar mis scripts si se encuentran en pleno proceso, osea no se debe ejecutar la misma página mas de una vez al mismo tiempo.

Por tanto, luego de instalar el codigo, como se que la pagina se demora en cargar, entonces a través del navegador yo refresco la página cuando se que aun se encuentra ejecutando el script, al hacer esto yo provoco la reaccion de la clase, para verlo trabajar y saber si me permite ejecutar el script o de plano me bloquea como es su trabajo. Entonces cuando refresco la página apenas cuando ejecute el script la clase funciona perfectamente, me bloquea. Pero cuando la carga anterior ya esta casi por acabar y refresco la página me sale error, ese es el problema. Tiene alguna idea de que puede estar mal?
  #15 (permalink)  
Antiguo 18/03/2010, 14:49
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 14 años, 8 meses
Puntos: 5
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

¿Y el error q te sale es....?
  #16 (permalink)  
Antiguo 18/03/2010, 16:19
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

El error lo explique mas arriba:

Cita:
Iniciado por Devjunx Ver Mensaje
Hola, me sale esto:
Código:
Warning: unlink(/home/domain/public_html/cron/cron.lock) [function.unlink]: No such file or directory in /home/domain/public_html/cron/cron.php on line 44
la linea 44 es esta:
Código:
unlink( $this->file );
No entiendo porque sale este error cuando lo ejecuto a través del navegador actualizando la página varias veces rapidamente, le di permisos de carpeta ademas; eso es normal o algo tiene el código de mal?
No se porque sale ese error, alguna idea?
  #17 (permalink)  
Antiguo 18/03/2010, 19:54
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 14 años, 8 meses
Puntos: 5
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

A ver, este error te sale cuando ejecutas varias veces el script (lo mismo que actualices varias veces la página?)
Si es así es lógico, porq es lo q hace tu script
  #18 (permalink)  
Antiguo 18/03/2010, 20:19
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Hola, entonces este error:

Código:
Warning: unlink(/home/domain/public_html/cron/cron.lock) [function.unlink]: No such file or directory in /home/domain/public_html/cron/cron.php on line 44
Es normal?, es que crei que solo debia decir "app running" como señal de que no se ejecutará, y como ese mensaje "app running" si sale pues me parece extraño que en otras veces tambien salga ese error tipico de PHP, Eulloa, si es normal me podrias explicar por favor porque me sale ese error "warning" algunas veces, y en otras me sale "app running"??
  #19 (permalink)  
Antiguo 18/03/2010, 20:39
Avatar de eulloa  
Fecha de Ingreso: octubre-2007
Ubicación: Donde caiga la noche, si mi hijo me deja
Mensajes: 691
Antigüedad: 14 años, 8 meses
Puntos: 5
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

He corrido tu script y la clase no me tira ese error del unlink. Prueba a quitar el destructor, comenta la línea del unlink
  #20 (permalink)  
Antiguo 19/03/2010, 07:24
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: ¿Existe forma de evitar que una página se ejecute más de una vez al mismo

Muchas gracias por todo amigos, saludos.

Etiquetas: existe, formulario
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 03:00.