Comunidad de diseño web y desarrollo en internet online

Ejecutar una función en PHP después de 5 minutos

Citar            
MensajeEscrito el 25 Ene 2013 10:36 am
Hola.
¿Es posible ejecutar una función en PHP después de 5 minutos sin parar la ejecución del programa ni que se quede colgado? Es decir, sin sleep.

Podría hacer un fork con pcntl_fork() y que el sleep() lo hiciera un proceso hijo, pero esa función no funciona en servidores Apache. Y uso Apache.

Tampoco me gustaría usar cronjobs de momento...

¿Alguna solución?
Un saludo

Por vicenrele

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 25 Ene 2013 12:25 pm
Los scripts PHP tienen un tiempo finito de ejecución que está determinado por el valor de la clave max_execution_time que está en el php.ini.

Pero lamentablemente a menos que tengas el control del servidor web, no podrás modificar ese valor. El valor por omisión son 160 segundos.

Si fueras tan amable de explicarnos por qué quieres hacer lo que estás diciendo que quieres hacer, tal vez le encontremos otra posible solución.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 25 Ene 2013 12:38 pm
Tengo una aplicación web que en su versión demo solo puede ser usada por un usuario a la vez y solo durante 5 minutos. Para controlar esto, tengo una variable flag en la base de datos para indicar si la aplicación está ocupada y otro usuario no puede utilizarla mientras (se controla al hacer login). Esa variable se resetea mediante una petición Ajax en las siguientes circunstancias:
- cuando el usuario que usa la aplicación cierra la ventana
- cuando se acaba el tiempo (se hace logout automáticamente)
- cuando el usuario hace logout manualmente

Tras estas circunstancias, se posibilita al siguiente usuario que pueda acceder a la aplicación haciendo login, pero...¿y si el usuario que está usando la aplicación pierde la conexión a Internet y no vuelve a acceder a la aplicación? La variable flag de la base de datos quedaría sin resetear y el siguiente usuario no podría utilizar la aplicación.
Por tanto es necesario resetear dicha variable también desde PHP, pasados 5 minutos desde que un usuario accede a la aplicación.

Por vicenrele

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 25 Ene 2013 12:45 pm
Bueno, me parece bastante simple lo que tienes que hacer, Cada vez que un usuario hace login, guárdate la fecha y hora junto al cambio en el flag que comentas (supongo que también te guardas algún identificador del usuario tal como si id en la BD).

Luego, antes de que el usuario ejecute una acción sobre el servidor, verificas la hora actual contra la hora guardada anteriormente, si excede los 5 minutos (o el tiempo que quieras), le haces un logout volviendo a resetear el flag y la hora. Eso es todo.

Si el usuario deja el navegador sin hacer nada por más de 5 minutos y otro usuario quiere entrar, solo tienes que verificar de nuevo la hora del flag, y si han pasado más de 5 minutos, dejas entrar al nuevo usuario; el anterior cuando quiera realizar cualquier acción verá que su tiempo expiró de todos modos.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 25 Ene 2013 12:47 pm
Y no decís que la sesión se cierra sola después de 5 min??

Y también te convendría controlar cuando un nuevo usuario solicita acceder, si hay alguno conectado hace más de 5 min y que eso le cierre la sesión.


...¿y si el usuario que está usando la aplicación pierde la conexión a Internet y no vuelve a acceder a la aplicación?

No se como sera la calidad de las conexiones de donde sos, pero tenes dos opciones...
- O dejas que pasen los 5 min(en el peor de los casos...) sin que lo use nadie.
- O te haces una api integrada con los proveedores de internet para identificar la conexión de un usuario y que te advierta en caso que se corte... o al sistema lo haces por turnos y le mandas un vago a la casa que si se le corta internet te llame por teléfono para que le cerres la sesión... :lol: :lol: :lol:

Saludos!

Por SinSemilla

Claber

336 de clabLevel



Genero:Masculino  

i am that i am...

firefox
Citar            
MensajeEscrito el 25 Ene 2013 01:03 pm
@SinSemilla:
Te contesto a lo que dices que me convendría controlar:
En mi respuesta indico que eso ya lo tengo controlado: "- cuando se acaba el tiempo (se hace logout automáticamente)".

Y a lo segundo que comentas de las conexiones de Internet, no se trata si son buenas o no, se trata de que la aplicación esté preparada para todos los casos posibles. Puede haber muy buena conexión pero por cualquier circunstancia la conexión se podría cortar (por deshabilitar el receptor wifi del pc, por una avería, etc...). Y las opciones que das:
- La primera no es del modo que dices, porque si la conexión se ha perdido, la variable flag de la base de datos no se habrá reiniciado y pasen los minutos que pasen, el sistema no dejará hacer login a ningún usuario.
- Y la segunda es buena idea! jejejej XD

Por vicenrele

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 25 Ene 2013 01:11 pm
@DriverOp, es buena idea eso que dices. De esa manera solo tendría que reiniciar la variable desde el servidor con PHP. Lo que pasa es que además de la hora, tendría que guardar la fecha también, por si no usa nadie la aplicación en todo un día o más.

Por vicenrele

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 25 Ene 2013 01:23 pm
Bueno, no solo se tendría que resetear desde PHP, solo supliría el caso: "cuando se acaba el tiempo (se hace logout automáticamente)", porque si un usuario cierra la aplicación antes de que pasen los 5 minutos, no podrán acceder otros usuarios en ese intervalo de tiempo. Para 5 minutos de demo de la aplicación no se notaría apenas, pero si el tiempo de la demo fuera por ejmplo 15 minutos, no sería eficiente.

Por vicenrele

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 25 Ene 2013 01:35 pm
Aún así me gustaría considerar antes alguna otra opción para no tener que trabajar con fechas y horas

Por vicenrele

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 25 Ene 2013 03:33 pm
Debido a cómo funciona el protocolo HTTP (el cual es cliente-servidor), el problema que planteas no tiene solución, simplemente porque el servidor no hace nada a menos que el cliente se lo pida. La alternativa usando server-side-events está muy verde y no todos los navegadores lo soportan ni todos los servidores lo han implementado, así que por ahora, como dije, no tiene solución.

Por otro lado no te conviene implementar esas restricciones en JavaScript porque como el código se ejecuta en el cliente, pierdes el control de lo que sucede allí (aunque no es normal, un usuario decidido puede modificar el código JS para hacerse de más tiempo en la demo...)

Debido a que estás trabajando con tiempo ("5 minutos") no podrás escapar de las fechas y horas :)

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 25 Ene 2013 03:48 pm

vicenrele escribió:


- La primera no es del modo que dices, porque si la conexión se ha perdido, la variable flag de la base de datos no se habrá reiniciado y pasen los minutos que pasen, el sistema no dejará hacer login a ningún usuario.


La variable flag la tenes que comprobar y reiniciar cuando acceden otros visitantes y consultan esa sección, el control lo tenes que hacer del lado del servidor, no del cliente.

Saludos!

Por SinSemilla

Claber

336 de clabLevel



Genero:Masculino  

i am that i am...

firefox
Citar            
MensajeEscrito el 25 Ene 2013 04:14 pm

SinSemilla escribió:


La variable flag la tenes que comprobar y reiniciar cuando acceden otros visitantes y consultan esa sección, el control lo tenes que hacer del lado del servidor, no del cliente.


Claro, de eso trata la pregunta de este post.
Del lado del cliente también envío una solicitud Ajax para reiniciar la variable flag porque puede darse el caso de que el usuario cierre la aplicación antes de los 5 minutos. Habría un intervalo de tiempo en el que la aplicación no se estaría usando pero ningún usuario podría utilizarla. Para 5 minutos casi no es apreciable, pero si el tiempo fuese mayor si sería relevante

Por vicenrele

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 25 Ene 2013 08:56 pm
A ver si nos entendemos...

Actualmente vos cerras la sesión o comprobas que haya que cerrarla cuando:

-Del lado del cliente:
* Cierra sesión
* Cierra el navegador
* Paso el tiempo máximo

-Del lado del servidor:
* Cuando entra otro usuario solicitando acceso (si otro tiene la sesión abierta y se le venció el tiempo se la cerras y se la abrís al nuevo...)

Hasta ahí bien... El problema pasa cuando vos no detectas que el cliente corto la conexión y todavía tiene su sesión abierta y le queda tiempo de sobra. Vos lo que no queres es desperdiciar ese tiempo...

Lo que se me ocurre es que le pongas un campo más que sea 'idle' y que cada 1 minuto por ejemplo hagas una petición ajax programada...

Entonces controlas que no haya sesiones abiertas, y si las hay que no haya pasado el tiempo máximo, y si no lo ha superado que el 'idle' no supere el minuto...

Seguramente haya algo más sencillo, pero a esta hora ya no me quedan muchas neuronas...

Saludos!

Por SinSemilla

Claber

336 de clabLevel



Genero:Masculino  

i am that i am...

firefox
Citar            
MensajeEscrito el 25 Ene 2013 09:09 pm
Lo he solucionado con otro campo en la base de datos TIMESTAMP. Cuando un usuario se loguea, resetea la variable en la base de datos y actualiza el CURRENT_TIMESTAMP con la fecha y hora actual + 5 minutos. De esta manera, cada vez que entra un usuario, se comprueba si la variable está reseteada O la fecha y hora actual es mayor o igual que la del timestamp de la variable. De esta manera se pueden controlar todas las situaciones.

Por vicenrele

17 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.