Foros del Web » Programando para Internet » PHP »

Ejecutar ordenes automáticamente cada x tiempo

Estas en el tema de Ejecutar ordenes automáticamente cada x tiempo en el foro de PHP en Foros del Web. Hola! Estoy desarrollando un juego online para aprender a programar en php. El caso es que me haria falta saber como hago para que cada ...
  #1 (permalink)  
Antiguo 21/01/2006, 08:30
 
Fecha de Ingreso: enero-2006
Mensajes: 38
Antigüedad: 11 años, 10 meses
Puntos: 0
Pregunta Ejecutar ordenes automáticamente cada x tiempo

Hola!

Estoy desarrollando un juego online para aprender a programar en php. El caso es que me haria falta saber como hago para que cada hora por ejemplo, a cada usuario se le haga un cálculo con un elemento de la base de datos y se modifique, por ejemplo.

El problema no es calcular con elementos de la bbdd ni las modificaciones, el problema es que no se declarar "que cuando pase nosecuanto tiempo se haga esto".

Muchas gracias y saludos!
  #2 (permalink)  
Antiguo 21/01/2006, 08:58
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 12 años, 10 meses
Puntos: 20
De hecho yo estoy haciendo algo parecido.

Hay que usar la función timestamp(); aunque todavía no sé cómo porque no me he puesto...

¿Tienes Messenger? Estaría bien que pudieramos estar en contacto
  #3 (permalink)  
Antiguo 21/01/2006, 09:03
 
Fecha de Ingreso: enero-2006
Mensajes: 38
Antigüedad: 11 años, 10 meses
Puntos: 0
Sí, pero no me conecto casi nunca. De todas formas toma por si me pillas por ahí alguna vez: [email protected]

Salu2!
  #4 (permalink)  
Antiguo 21/01/2006, 09:15
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.460
Antigüedad: 15 años, 4 meses
Puntos: 2097
Creo que tienes que usar Cron Job (en caso de que uses Linux), pero ésto se realiza desde el servidor, es decir, no es PHP.

Automatizar algo en PHP que ocurra cada X tiempo, hasta donde yo sé, no se puede hacer. Pero sí se puede hacer, que el servidor realize una tarea cada cierto tiempo.
  #5 (permalink)  
Antiguo 21/01/2006, 11:07
 
Fecha de Ingreso: enero-2006
Mensajes: 38
Antigüedad: 11 años, 10 meses
Puntos: 0
Utilizo windows xp, así que ni idea de como hacerlo todavia.

He probado con date(), diciendo que cuand el minuto sea 30 por ejemplo que sume un turno pero no hace lo que quiero :(
  #6 (permalink)  
Antiguo 21/01/2006, 11:12
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.460
Antigüedad: 15 años, 4 meses
Puntos: 2097
Si usas Windows (en el servidor, me refiero) entonces puede ayudarte el Administrador de Tareas.
  #7 (permalink)  
Antiguo 21/01/2006, 11:17
Avatar de nosoynadie  
Fecha de Ingreso: noviembre-2005
Ubicación: dando vueltas por aquí
Mensajes: 206
Antigüedad: 12 años
Puntos: 1
Hola a todos,

ya que no puedes utilizar un Cron job y/o no consideras utilizar el Programador de tareas de Windows qué te parece esta propuesta:
¿por qué no haces una función en JavaScript, que cada cierto intervalo de tiempo llame a un documento PHP y que este sea el que haga la actualización que deseas?

¿ Te puede valer esta opción ? Ciao
__________________
http://www.nosoynadie.net/
  #8 (permalink)  
Antiguo 21/01/2006, 13:08
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 12 años, 10 meses
Puntos: 20
Sí, puede valerme. Respondo ya que yo estoy haciendo lo mismo que él. A ver si nos puedes explicar eso último nosoynadie.

En cuanto al servidor, el mio es linux, y el de akalon supongo que también.

Muchas gracias

PD: ¿De qué es tu juego, akalon?
  #9 (permalink)  
Antiguo 21/01/2006, 21:30
 
Fecha de Ingreso: enero-2006
Mensajes: 38
Antigüedad: 11 años, 10 meses
Puntos: 0
En javascript si puede hacerse esto que pedimos?
Estupendo como se hace? (Teniendo en cuenta que lo que queremos es que esta acción se haga siempre, aun cuando los usuarios no están conectados)

De momento estoy usando apache y trabajando en localhost, aún no entiendo muy bien el tema este de los servidores...

En cuanto a mi juego, es un simulador de un pais actual. Ya hay varios por ahí circulando de ese tema y bastante buenos pero para ir aprenieno me vale
De qué va el tuyo?

Gracias y saludos!

Última edición por akalon; 21/01/2006 a las 21:41
  #10 (permalink)  
Antiguo 21/01/2006, 21:47
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 12 años, 10 meses
Puntos: 20
Cada jugador lleva un ejército, o civilización, y va creando unidades, consiguiendo recursos, construyendo edificios... basado en la época medieval. Todo ello con razas, hechizos, criaturas.. y cosas de éstas :P La gente puede atacar a otros jugadores y formar alianzas.

También hay muchos del tipo, pero al darle ese toque de rol e inventar varios aspectos como las razas, criaturas... lo hace único jeje.
  #11 (permalink)  
Antiguo 22/01/2006, 07:16
 
Fecha de Ingreso: enero-2006
Mensajes: 38
Antigüedad: 11 años, 10 meses
Puntos: 0
No hay manera de que funcione, he probado con este js script, que viene a ser lo que habia hecho en php pero tampoco va:

<script language="javascript">
var contador=0;
var momentoActual = new Date();
var segundo = momentoActual.getSeconds();
document.form.tiempo.value = segundo;
if (segundo==30)
{
++contador;
document.form.cont.value = contador;
}
</script>

Esto escribe el segundo en el que está en una etiqueta texto cuando recargas la página, se supone que cuando los segundos valgan 30 tendría que ir sumando 1 al contador que está escrito en otra etiqueta, pero nada, sale 1 y no sube más...

AYUDA PLEASEE!!
  #12 (permalink)  
Antiguo 22/01/2006, 07:53
 
Fecha de Ingreso: enero-2006
Mensajes: 38
Antigüedad: 11 años, 10 meses
Puntos: 0
He logrado algo, cada 10 segundos se suma 1 al contador y lo escribe:

<script language="javascript">
var contador=0;
function tiempo()
{
++contador;
document.form.cont.value = contador;
}
function temp()
{
setInterval("tiempo()",10000);
}
</script>

Dentro de la etiqueta <body> hay que añadir onload="temp()"
creo que es para que vaya recargando la función

Lo que pasa es que creo que esto solo va a ir andando cuando el usuario cargue la página del onload.

Buff, esto es una movida...
  #13 (permalink)  
Antiguo 22/01/2006, 08:56
 
Fecha de Ingreso: enero-2006
Mensajes: 38
Antigüedad: 11 años, 10 meses
Puntos: 0
Creo que he llegado a la conclusión de que no puede hacerse esto que queremos, y que hay que hacerlo obligatoriamente ejecutando la acción desde el servidor, y esto solo se puede hacer como han dicho antes si tu ordenador es el servidor y programas la tarea de actualizació de la base de datos apra no tener que hacerlo manualmente.

Así que habrá que inventarse una forma no automática de que los usuarios reciban los turnos o algún método sin turnos.

A ver si alguien me dice lo contrario pero me da a mi que esto va así... :(

Salu2!
  #14 (permalink)  
Antiguo 22/01/2006, 14:19
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 12 años, 10 meses
Puntos: 20
Pero es que con JavaScript estaríamos en las mismas que con PHP, no? Se ejecutaría cuando el usuario entra en la web.
  #15 (permalink)  
Antiguo 22/01/2006, 18:31
 
Fecha de Ingreso: enero-2006
Mensajes: 38
Antigüedad: 11 años, 10 meses
Puntos: 0
Pues eso parece, los turnos tienen que ser actualizados "manualmente" a través del servidor por lo que se ve. Así que, o se inventa otro sistema que no sea por turnos, o se tiene un ordenador de server, o se actualiza la base de daos a mano, y parece que no hay otro remedio porque a nadie se le ocurre algún método

Bueno, pos me pondré a pensar la forma de hacerlo a ver...

Salu2!
  #16 (permalink)  
Antiguo 23/01/2006, 02:48
Avatar de nosoynadie  
Fecha de Ingreso: noviembre-2005
Ubicación: dando vueltas por aquí
Mensajes: 206
Antigüedad: 12 años
Puntos: 1
Hola chicos,

siento no haber leido bien tu petición, si lo hubiera hecho no te hubiera hecho la propuesta del JavaScript porque no vale para tu caso

Pero a lo mejor esto te puede valer:

dices que necesitas actualizar cada hora los turnos de los jugadores (en base a no se qué criterio). Ya que no utilizas las propiedades del servidor (los cron jobs) que te venía de perlas para hacer esto por qué no te replanteas el cuándo es necesario actualizar esos turnos. ¿No hay otro momento en el que puedas hacer la actualización? ¿Y por qué no la haces cuando inicie la sesión el primer usuario del día? Guardas en un campo de la BB.DD si se ha hecho la actualización, la hora en que se hizo la última o algo por el estilo y cada vez que entre un nuevo usuario revisas ese campo. Piensa si además de esto podrías añadir, a uno de ellos o a todos, el JavaScript para que mientras esté jugando, cada cierto tiempo, se ejecute un PHP que actualice.

Piensa si esta nueva línea de actuación te puede valer. Ciao
__________________
http://www.nosoynadie.net/
  #17 (permalink)  
Antiguo 23/01/2006, 07:04
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 12 años, 10 meses
Puntos: 20
Ya lo había pensado. De hecho era mi idea hasta que se me ha ocurrido pensar que los jugadores podrían estar "en diferentes tiempos"... Aunque ahora no recuerdo cómo había llegado a la conclusión porque me he liado.

En fín, la actualización que tú dices te refieres a un archivo que actualice a TODOS los jugadores a la vez? Y estamos hablando de javascript.. por qué no directamente PHP?
  #18 (permalink)  
Antiguo 23/01/2006, 09:38
Avatar de nosoynadie  
Fecha de Ingreso: noviembre-2005
Ubicación: dando vueltas por aquí
Mensajes: 206
Antigüedad: 12 años
Puntos: 1
Si, la actualización sería para todos los jugadores estaríamos dejando la tarea de actualizar al primer usuario que entrase en el juego y lo, único que sería en JavaScript, sería la función que llamaría al php que es el que realmente haría la actualización.
__________________
http://www.nosoynadie.net/
  #19 (permalink)  
Antiguo 23/01/2006, 18:31
 
Fecha de Ingreso: mayo-2005
Mensajes: 12
Antigüedad: 12 años, 6 meses
Puntos: 0
hola, yo también tengo algo similar, por ejemplo en mi caso quisiera hacer un script en PHP que cada cierto tiempo visite cierta página y lea datos de ella.

Como haría para que se hiciera esto automáticamente.
  #20 (permalink)  
Antiguo 23/01/2006, 20:28
Avatar de dopon  
Fecha de Ingreso: julio-2005
Ubicación: Cucuta / Colombia
Mensajes: 493
Antigüedad: 12 años, 4 meses
Puntos: 1
Cita:
Iniciado por akalon
En javascript si puede hacerse esto que pedimos?
Estupendo como se hace? (Teniendo en cuenta que lo que queremos es que esta acción se haga siempre, aun cuando los usuarios no están conectados)

De momento estoy usando apache y trabajando en localhost, aún no entiendo muy bien el tema este de los servidores...

En cuanto a mi juego, es un simulador de un pais actual. Ya hay varios por ahí circulando de ese tema y bastante buenos pero para ir aprenieno me vale
De qué va el tuyo?

Gracias y saludos!
Haber primero que todo la solucion mas sencilla para lo que tu desea es usar un CronTab o Cron Job como lo dices y efectivamente es en linux .

Si no tienes acceso a eso o simplemente deseas buscar una forma que puede solucionar ese problema ;) realmente muchos scripts necesitan actualizarce cada X tiempo y a veces es engorroso pedirle al webmaster que efectue unas modificacione para crear un Cron Job. No solo porque a veces este tipo de scripts son provistos para personas con bajos conocimientos en informatica (p ej un Mod para PhpBB) o simpleemente para crear un script que pueda ser utilizado sin las limitantes de tener o no un CronTab habilitado.

Tu dices que la accion se haga siempre y cuando los usuarios no esten conectados. Y lastimosamente la solucion para eso es un cron Tab , una solucion bastante drastica seria un script que se llame a si mismo osea infinitamente recursivo , que lo corras una vez y quede en un bule infinito , cosa ilogica y utopica ya que tu server tiene un tiempo maximo de jecucion.

Una solucion que aunque aparentemente no satisface la condicion , funcionara muy bien si lo analizas.

Si los datos de los usuarios que van a ser actualizados por ejemplo son exclusivamente vistos en una tabal de ranking por ejemplo o solo son vistspor usuarios registrados. Lo que debes hacer es un script que haga todas las actualizaciones lo llamaremos update.php,

supongamos que las actualizaciones se hacen cada Hora en algun lugar de tu DB o en un archivo plano (opcion recomendada) que me sirva para cuardar un unico dato un timetstamp.

Bien y como haremos que funcione cada HOra. En realidad no se ejecutara cada hora pero si cumplira con la funcion especifica .

El proceso es el siguiente. el campo en la DB o archivo plano guardara el timestamp de e momento en que se realizo la ultima actualizacion . en update.php debe ir una funcion de control mediante la cual cuando update.php se ejecute mire el time()actual y observe si ya esta fuera del espacio de la hora de la ultima actualizacion haga la actualizacion inmediatamente al instante.
Preguntaras cuando se ejecuta update.php ?
la ejecucion de update.php debes tratar de ubicarlo en un lugar de forma que sepas que un usuario al visitar tu web obligatoriamente va a llamarlo. La actualizacion no se ejecutara siempre , para eso se debe hacer un control mirando el timestamp de la ultima actualizacion.

Vos diras Bueno pero no me sirve porque si no hay usuarios conectados , nunca nadie hara que el update.php se ejecute. esto es cierto. pero dejame responderte con otra pregunta. Si nadie esta en tu sitio web de que te sirve actualizarlos si NADIE va a verlos asi que es una opcion viable, espero haberme hecho entender , yo ya la he puesto en practica y hace lo que debe hacer . no lo hara cada hora pero si funcionara como si lo hiciera
  #21 (permalink)  
Antiguo 23/01/2006, 20:36
Avatar de dopon  
Fecha de Ingreso: julio-2005
Ubicación: Cucuta / Colombia
Mensajes: 493
Antigüedad: 12 años, 4 meses
Puntos: 1
Cita:
Iniciado por nobileelpirata
hola, yo también tengo algo similar, por ejemplo en mi caso quisiera hacer un script en PHP que cada cierto tiempo visite cierta página y lea datos de ella.

Como haría para que se hiciera esto automáticamente.
Esto no lo habia leido al publicar la otra respuesta

puedes hacerlo de dos formas a mi parecer

la primera con funciones de manejo de ficheros con fopen
la segunda es mas dedicada a esto y es funcional ya que permite manejo de cookies y mil cosas mas es el uso de la libreria CURL

di que necesitas y te doy ideas
  #22 (permalink)  
Antiguo 24/01/2006, 03:21
 
Fecha de Ingreso: enero-2006
Mensajes: 38
Antigüedad: 11 años, 10 meses
Puntos: 0
Muchas gracias por tu extensa explicación. Nosoynadie me había dado una idea de como hacerlo, y tú ya me lo has dejado claro.

Solo un par de preguntas: yo tenia pensado guardar la hora en la bbdd pero dices que es mejor hacerlo en un archivo plano ¿qué es un archivo plano?

Y lo de los cronjobs solo serviría (además de teniendo linux) si mi ordenador actuara de servidor, si cuelgo la web en un servidor gratuito de internet no podria hacerlo ¿verdad?

Mucha gracias y saludos!
  #23 (permalink)  
Antiguo 24/01/2006, 09:35
Avatar de dopon  
Fecha de Ingreso: julio-2005
Ubicación: Cucuta / Colombia
Mensajes: 493
Antigüedad: 12 años, 4 meses
Puntos: 1
lo del archivo plano lo digo que me parece que es mejor que la DB por el detalle de que me imagino ya tienes estrucuturadas todas las tablas para su determinado uso y me parece inecesario añadir una tabla simplemente para guardar un tiemstamp. cuando te hablo d eun archivo plano por ejemplo me refiero a valor.txt donde valor.txt en su contendido tiene por ejemplo 11452789012 un valor de timestamp, pero si te queda facil por ejemplo añadir un campo en alguna tabla de configuracion es mas facil, lo decia para que te ahorraras crear una tabla en caso que no tuvieses una tabla de configuracion o algo asi.

Pues una vez tuve mi web en un servidor gratuito que dejaba hacer cron Jobs pero ese servidor acabo era muy bueno para ser gratis :P .
En los de pago si tengo dos cuentas en dos diferentes y si lo trae. ademas estan baratos los planes pequeños y hay que aprovechar XD
  #24 (permalink)  
Antiguo 24/01/2006, 10:21
 
Fecha de Ingreso: enero-2006
Mensajes: 38
Antigüedad: 11 años, 10 meses
Puntos: 0
Ok, muchas gracias por ut respuesta, ha sido de mucha ayuda. Ya contaré como va el asunto.

Saludos!
  #25 (permalink)  
Antiguo 24/01/2006, 10:29
Avatar de dopon  
Fecha de Ingreso: julio-2005
Ubicación: Cucuta / Colombia
Mensajes: 493
Antigüedad: 12 años, 4 meses
Puntos: 1
Ok me complace ayudar ya que algunas veces poner a prueba los conocimientos y el ingenio. :P los retos son buenos ya yudan a edificar
  #26 (permalink)  
Antiguo 24/01/2006, 10:51
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 13 años
Puntos: 1
De acuerdo cron jobs no es nada del otro mundo

Si tu tienes un servidor gratuito o si no, no importa.

Más bien checa que tenga CPanel, si tú tienes CPanel para administrar tu cuenta, casi estoy seguro de que una de esas opciones se llama "Cron Jobs".




Con Cron Jobs tú le dices exactamente que ejecute cierto Script cada X tiempo.

¿y si no tienes Cron Jobs o trabajas con Windows?
No importa ! Además no necesitas javascript (si es que entendí lo que deseas hacer).

Mira, podrías hacer una función que se llamara:

Código PHP:
function actualizar_turnos() 
Ahora imagina que esta función se encarga de hacer todo el trabajo que necesitas (para ello quizá quieras que se conecte a una BD, que envíe ciertos emails, etc, etc. Es decir, esa función se ocupará de hacer toda la actualización). Ahora, si la metes al inicio de cada una de tus páginas, ¿qué ocurriría?

Que los turnos no se actualizarán cada X minutos, ni al inicio de cada día, sino cada vez que un usuario cambia de página. Es decir, los usuarios podrían pensar que lo estás haciendo en tiempo real!

Ahora, si crees que esta función que te platico hace su trabajo con demasiada frecuencia, entonces podrías intentar algo como esto, crea un archivo de texto plano en tu server y haz una función que lea ese archivo, reste la hora actual de la que obtuvo en ese archivo y si ha pasado "cierto" tiempo, que actualice, algo así:

Código PHP:
if(verifica_ultimo_tiempo())
     function 
actualizar_turnos(); 
La función actualizar_turnos() sigue haciendo lo que comenté al principio, pero ahora sólo lo hará cuando la función verfica_ultimo_tiempo() lo autorice regresando un 1. Si regresa un 0 (lo que significa que es muy pronto para refrescar), entonces no se actualizarán los turnos.

Asegúrate de que verificar_ultimo_tiempo(), cuando regrese un 1, también reescribe en el archivito de texto plano la nueva hora, es decir, la hora en la que se generó la actualización.


¿Problemas?
Parece que nadie tocó aún los problemas de usar los archivos de texto plano. ¿Qué tal que dos personas ejecutan al mismo tiempo un script y los dos scripts abren desde diferentes sitios el archivo de texto plano y ambos quieren escribir sobre él?

Pues quizá echen a perder el archivo, ya que ahora tendrá datos basura. Para ello utiliza la función flock() que te permite bloquear un archivo para otras aplicaciones cuando tú estás trabajando con él.

Así es como se utiliza:

Código PHP:
 $aa fopen("/tmp/bloqueo.txt""w+");

if (
flock($aaLOCK_EX)) { // realizar un bloqueo exclusivo
    
fwrite($aa"Escribir algo aqui\n");
    
flock($aaLOCK_UN); // liberar el aviso

fclose($aa); 

Última edición por uamistad; 24/01/2006 a las 11:01 Razón: agregando información de flock()
  #27 (permalink)  
Antiguo 25/01/2006, 13:04
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 12 años, 10 meses
Puntos: 20
Cita:
Iniciado por dopon
Vos diras Bueno pero no me sirve porque si no hay usuarios conectados , nunca nadie hara que el update.php se ejecute. esto es cierto. pero dejame responderte con otra pregunta. Si nadie esta en tu sitio web de que te sirve actualizarlos si NADIE va a verlos asi que es una opcion viable, espero haberme hecho entender , yo ya la he puesto en practica y hace lo que debe hacer . no lo hara cada hora pero si funcionara como si lo hiciera

Sí, esa era mi teoría desde el principio... le encontré un "pero" y ya no recuerdo cuál, siempre que llego a éste post se me olvida
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 08:21.