Ejecutar PHP a una hora especifica

B

Hola, un amigo está haciendo un proyecto de juego basado en web (tipo ogame).

Y necesita saber como hacer que a una hora específica se ejecute una función PHP específica, algo así como los eventos en programación.

Sería para por ejemplo al hacer un ataque, que cuando llegue la flota al destino se produzca la batalla.

¿Como podría hacer algo así?

SeiYa

me gustaría saberlo para hacerme un manager de fútbol xD

B

pero la cosa es que cron deja configurarlo que s ehaga cada x minuto, pero no deja que s ehaga cada "x" segundos como es su caso que lo necesita, cada segundo...

editado: es decir, como harías vosotros para el ejemplo que he puesto. Yo envio una flota a otro planeta, y cuando llegue la flota se debería de procesar el ataque, la flota tardara un tiempo "x" y cuando pase ese tiempo "x" como haría para que se ejecutara la batalla?

guner

Si lo ejecutas fuera del servidor, con un cliente php (ejecutable php) de línea de comandos...

for ( ; ; ) {
sleep (1);
/* TODO */
}

EnZo

no creo que los de ogame lo hagan con un temporizador

B

la cosa está, como creeis vosotros que lo hacen los de ogame?

SeiYa

¿Quizás debido a la cantidad de gente que lo hace, se mete en una BBDD que dice, ataque a las 16:00 y si nadi entra hasta las 19:00 no se produce realmente y cuando alguien entra mira esa BBDD y ve los ataques que en teoría deberían haberse realizado y los realiza?

Esa fue la forma cutre que yo imaginé XD

F

Lo hacen como #8.

Como me costó entender de qué hablaba, traduzco.

Realmente no lo hacen cada segundo (¿Pero estáis locos? ¿Sabéis la carga de servidor que produce eso?) Símplemente en las páginas del juego, al inicio de cada una de las páginas (En el index.php, donde se mira la flota, donde se construyen cosas, etc.) se mira si hay algo que calcular (Por ejemplo, el tiempo que tardará en salir la flota y tal.)

Si un evento ocurre aunque el usuario no esté haciendo cosas, pues se pueden hacer eventos globales, que ocurran cuando CUALQUIER usuario mire la página.

Joder, si me he explicado peor que #8 xD

Si te pones tontorrón, también puedes dejar un proceso corriendo en el servidor que se encargue solo de comprobar eventos de ese tipo. Eso sí, por favor, no lo hagas en PHP si no quieres que la CPU arda en llamas.

SeiYa

Que listo que soy.

B

el problema esta en que si, por ejemplo, a las 10 hay una batalla y nadie mira el juego hasta las 12, despues hay que procesar una batalla de hace dos horas, y en ese tiempo se puede haber creado naves mientras en la cola del hangar, o cualquier otra cosa que alteraria el estado de la batalla

BlisZ

pues antes de procesar la batalla procesa la creacion de naves

SeiYa

Claro, habría una prioridad de procesos que es casi donde está la chicha gorda del código.

Otro tema diferente son los managers de fútbol online, en los cuales se calculan los resultados a una hora específica.

Es el caso de Sundayleague, donde a en unas horas no puedes acceder por que los servidores están realizando los cálculos, y si los calculos se realizan entre las 10 y las 12 y alguien entra a las 14 sin haber entrado nadie desde las 9 por ejemplo, no te hace los cálculos a las 14 por que son cálculos muy pesados que requieren tiempo, simplemente, ya están hechos, ese sería otro tema ya que solo tienes que hacer un calculo (enorme) al día, no calculos cada 5 minutos (ataques y demás).

Yomosucith

pero vuestro sistema falla. Si por ejemlo durante 2 horas nadie entra y se acumulan unas cuantas batallas eso podria sobrecargar demasiado el servidor con lo q las paginas tardarian mas en cargar (o incluso el pobre pringao q entrara 1r no le cargaria ni lapagina >.<).

El truco esta en solo cargar lo que realmente se necesita. Si yo entro al cabo de 2 horas de q nadie entrara solo calculara las batallas q me puedan afectar a mi (x ejemplo un atake q aya echo yo, un atake q me agan a mi, un atake algun aliado mio... pero no un atake q a realizado pepito en noseke sitio y q me la trae floja xq no tienen nada q ver conmigo). Repito que si no se hiciera eso, el pobre pringado q entre 1r le tocaria esperar a k el server generara la tira de batallas construcciones, etc. y eso es 1 chorrada.

EnZo

Esque si tu tienes una cola de procesos en una tabla, no tienes porque hacerlos todos de tiron. Logicamente haras los que necesites, si no menuda optimizacion...

Kaos

Yo tb estoy liado programando algo muy grande, supongo q dentro de unos meses tendréis noticias mias en la web xD. Tb lleva un sistema de juego similar a ogame aunq no tiene demasiado q ver en conceptos generales.

Voy al grano, hace mil q no juego a ogame y aunq el sistema q te comento no lo voy a usar en mi juego creo q es el q usan ellos.

Yo creo q todo lo q construyes tiene un valor por defecto de ESTADO. El estado puede ser, viajando, atacando, en hangar, etc. Y por otro lado usando el sistema de #8. Es decir, nada se calcula hasta que el usuario q ataca o q defiende se conecta.

Imagina q mandas unas naves a atacar y llegan en dos horas, si mandas 20 naves, esas 20 naves pasan a estado ATAKE por ejemplo. Hasta q no se cumplan esas dos horas tus naves no existen en otro estado por lo tanto no se mezclaran con las de hangar ni interferiran en otras colas.

Yo creo q el concepto de la idea es crear un campo en cada tipo de unidad alineada en el batallon q sea ESTADO y setearlo al q mejor te convenga.

Otro caso practico. Construyo 20 cazas, los cazas se crean en la base de datos, por ejemplo (Tipo: Caza, Unidades: 20, Estado: Hangar) Que quiero q ataquen? pues seteo esa entrada ESTADO=Ataque. Cuando vuelvas al angar por supuesto debes de señalar en el query que solo muestre aquellas unidades donde estado NOT LIKE "ataque"...

En fin supongo q la idea mas o menos la puedes captar verdaD?

Un saludo y a ver si das noticias de ese proyecto para ver la evolucion q estoy interesado en la competencia jaja.

Usuarios habituales