Foros del Web » Programando para Internet » Javascript »

Producir un evento sin que se conecte el usuario

Estas en el tema de Producir un evento sin que se conecte el usuario en el foro de Javascript en Foros del Web. Saludos, estoy desarrollando un juego de navegador y tengo un par de problemas. En primer lugar, cuando el usuario construye una cosa tarda un tiempo ...
  #1 (permalink)  
Antiguo 18/10/2012, 06:39
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Pregunta Producir un evento sin que se conecte el usuario

Saludos, estoy desarrollando un juego de navegador y tengo un par de problemas.
En primer lugar, cuando el usuario construye una cosa tarda un tiempo en construirse, pero si el usuario no actualiza la pagina cuando ha acabado este tiempo no se produce la ampliación. Esto ocurre también con la producción de recursos.

¿Cómo hago para que las ampliaciones y producción de recursos se produzcan sin que el usuario se conecte?
Porque si por ejemplo le atacan y no ha actualizado la pagina en un día, los recursos que tendrá serán los de hace un día.

El segundo problema es del Ajax. Hay una función Ajax que actualiza los recursos cada segundo. Esto lo hago con un setInterval de la función. Pero también hay otra función que es para que actualice cada segundo el tiempo que falta para que acabe la construccion.
El problema es que si pongo que se ejecuten las 2 cada segundo solo se me ejecuta la última y si hago referencia a una dentro de otra se me peta.

¿Cómo puedo hacer para que se ejecuten las dos?
¿Podría hacer las dos consultas Ajax en la misma función?
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #2 (permalink)  
Antiguo 18/10/2012, 06:54
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Producir un evento sin que se conecte el usuario

aclaremos un poco los conceptos:

1 - Ajax no se recomienda para hacer juegos de interactividad online, así como lo tienes se le llama polling (1 petición x tiempo constante) eso satura el ancho de banda del servidor cuando la cantidad de usuarios es elevada.

2 - lo ideal es usar COMET, lo cual su implementación varía en función de lo que dispones, por ejemplo en PHP (por ahora) no se puede hacer un server multi-threading, por lo tanto usar HTML5 WebSockets (comet) es inviable, existen alternativas como APE (de pago) y AJAX longpolling, de idual forma el longpolling sólo aligera la saturación del ancho de banda, pero consume muchos recursos del servidor y a la larga con una cantidad considerable de usuarios puede fallar.

Tendrás que buscar alternativas para implemetar comet si quieres continuar con el desarrollo del juego, es la vía más optima.

De igual forma puedes hacer 2 o más peticiones ajax, solo dependería si el servidor las rechaza por separado.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 18/10/2012, 10:23
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Producir un evento sin que se conecte el usuario

Muchas gracias por tu respuesta.
Pero no me has contestado a como hacer lo de que ocurra una construcción o se produzcan recursos aunque el usuario esté desconectado.
Y sobre lo de Ajax tendrá que haber una buena alternativa gratuita porque hay muchos juegos de este tipo mucho más grandes que usan PHP. ¿Dónde puedo encontrar información sobre el tema?

¿Me podrías poner un ejemplo de una función que hace 2 peticiones?

Saludos y gracias de antemano.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #4 (permalink)  
Antiguo 18/10/2012, 10:56
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Producir un evento sin que se conecte el usuario

Pues... yo creo que es algo evidente, todos los datos del usuario se deben guardar en algún medio persistente como base de datos, y cuando alguien afecte al usuario, medificar dicha base de datos. Además, habría que tener un proceso que o bien corra indefinidamente en el servidor para ir modificando los atributos del usuario según el tiempo o bien una tarea programada que revise el tiempo y cambie los datos. En ambos casos ya no pertenece al dominio de javascript como tal.
  #5 (permalink)  
Antiguo 18/10/2012, 10:58
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Producir un evento sin que se conecte el usuario

¿Y al dominio de quien pertenece y como se haría?

Saludos.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #6 (permalink)  
Antiguo 18/10/2012, 12:55
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Producir un evento sin que se conecte el usuario

¿cuales de esos juegos me dices?, porque la mayoría que he visto o usan Flash, Adobe ShockWave, javaFX o Applets de java, pero no 100% PHP ni mucho menos con JS puro, a lo sumo el backend principal puede estar hecho en PHP, pero el server multithreading o lo implementan con C++ u otros lenguajes del server, yo también realice una investigación sobre ese tema en su tiempo, y es ahora que en PHP 5.4 se dispone de un webserver propio, pero con respecto al manejo multithreading no he visto nada, APE es de pago sí, pero HTML5 WebSockets no (requiere del multi-threading), con node.js es relativamente simple de implementar, aunque no lo he probado.

¿hacer 2 ajax a la vez?: con 2 instancias del XMLHttpRequst ¿existe otra forma?: lo único es que el servidor rechace las peticiones por el exceso de ancho de banda del polling actual que tienes

¿ejecutar acciones sin la petición del usuario?: como te indicaron arriba, con un cronjob.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #7 (permalink)  
Antiguo 18/10/2012, 13:13
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Producir un evento sin que se conecte el usuario

Primero, ¿que es el multithreading?
Segundo ¿cual es la forma más sencilla de implementar comet? Porque no me puedo permitir hacerlo con C++ o similar porque partiría de 0.
Tercero ¿Hasta que punto se puede saturar el ancho de banda? ¿Cuantos usuarios sería o peticiones por minuto?
Cuarto, cosas como por ejemplo la actualizacion de recursos supongo que podría calcularlo con javascript sin tener que hacer una petición ajax por segundo y que los recursos se actualicen visualmente cada segundo pero que se actualicen en la base de datos cuando se actualiza. ¿Es esto factible?

Saludos y gracias de antemano.

PD: ¿Aquí sería útil Xajax?
PD2:¿Qué es un cronjob?
PD:He oido que a partir de php5 se pueden hacer comet
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.

Última edición por Fylux; 18/10/2012 a las 14:36
  #8 (permalink)  
Antiguo 19/10/2012, 08:40
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Producir un evento sin que se conecte el usuario

He visto que se pueden hacer comet a partir de PHP 5.

¿Es esto cierto?

Saludos.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #9 (permalink)  
Antiguo 19/10/2012, 09:15
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Producir un evento sin que se conecte el usuario

aclarando en orden:

1 - multi-threading o soporte de múltiples hilos, lo puede investigar en la web, básicamente es el soporte que tiene un lenguaje para crear varios hilos (procesos) independientes en la CPU, es lo que un server en la practica aplica, de otra forma no puede atender a muchos usuarios, apache lo hace, por ejemplo.

2 - no existe forma sencilla, depende del lenguaje, hay muchos tutoriales para node.js y aún así hay usuarios que les cuesta implementarlo.

3 - imagina un usuario el cual tiene un polling, es decir una petición x segundo, y se conectan en una hora alrededor de 1 usuario por segundo, tenemos una curva exponencial de usuarios x peticiones, a la hora tendríamos 3600 usuarios realizando a la vez 3600 peticiones x segundo y en aumento, eso satura el ancho de banda en un principio

4 - javascript se ejecuta en el cliente, irónicamente necesitas otra petición para saber si el server está saturado, suponiendo que falle como es lógico igual saturas el ancho de banda, todos los usuarios duplican la petición y tenemos el efecto mariposa en su máxima expresión: caos

5 - un cronjob sería el encargado de ser el server para el comet, pero sin soporte multi-threading no se pueden generar más hilos, por lo tanto el server comet es inútil en PHP

6 - el plugin Xajax comet es longpolling, sin soporte multi-threading tenemos el mismo problema (ojo su autor lo dice)

7 - PHP 5.4 como indique anteriormente tiene su server propio, pero no hay soporte para multi-threading por el cual no se puede crear un hilo y pasar el resource_id de la conexión (socket) del cliente para hacer el comet, por lo tanto no es posible hasta donde sé, no digo que no pueda existir la posibilidad, tendrías que averiguar.

como te había indicado ya había (valga la redundancia) hecho esta investigación, hace como 2 años, las cosas cambian, sólo hay que investigar lamentablemente no dispongo de tiempo para ello.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Última edición por maycolalvarez; 19/10/2012 a las 09:23
  #10 (permalink)  
Antiguo 19/10/2012, 09:44
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Producir un evento sin que se conecte el usuario

Pero entonces no podría crear una tarea automatizada en mi servidor. Por ejemplo que cada segundo se ejecute un archivo de código.

¿Esto no es posible con PHP?
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #11 (permalink)  
Antiguo 19/10/2012, 10:07
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Producir un evento sin que se conecte el usuario

¿y de qué te sirve si no puedes conectar con el cliente?, porque si haces la prueba creando un socket de escucha en php, entonces puedes esperar a que llegue la conexión de un cliente, cuando intentas crear el hilo para que ése hilo se encargue de ése cliente NO puedes pasarle el recurso del socket_id que se generó al hilo de proceso donde se supone que lo debe atender, por lo tanto no te queda otra que atenderlo en dicho hilo actual, y si lo haces así no puedes volver al modo escucha, por lo tanto NO se puede conectar otro cliente, yo ya lo hice y me pasó lo mismo.

favor investigue sobre la nueva versión (si es que la hay) del socket en php 5.4 y vea si existe algún cambio que permita ello, porque como le dije, NO funciona el multi-threading en PHP, y por lo tanto NO es posible un comet real.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #12 (permalink)  
Antiguo 19/10/2012, 10:54
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Producir un evento sin que se conecte el usuario

No te compliques la vida. Todos esos juegos de navegador tipo ogame y demás usan un CRONJOB para hacer que se ejecute un php periódicamente en el servidor (usualmente, cada pocos segundos). Un cronjob es una herramienta que tienen algunos paneles de control de servidores, como el CPANEL, que sirven para que periódicamente se ejecute un comando en el SHELL de linux donde está corriendo dicho servidor.
Lo más fácil es usar esa orden para ejecutar un PHP, y ese PHP servirá para hacer "mantenimiento", como limpiar imágenes o archivos temporales que no sirvan para nada, borrar registros de la base de datos que ya no sirvan, hacer una copia de seguridad de ficheros y bases de datos, etc. Tú podrías usar un fichero PHP que controle la lógica del juego. Sería el "motor", por así decirlo.


Básicamente, esos juegos están hecchos así: El jugador, cuando navega, está metiendo datos en ciertas tablas. El PHP que se ejecuta con el cronjob, procesa esos datos de las tablas y actua en consecuencia actualizando a su vez más tablas.

Puedes usar AJAX en la parte del cliente (als paginas que ven los jugadores), pero si no dominas mucho el tema, mejor que la interacción del jugador con las opciones del juego las hagas todas a través de enlaces y formularios.

Algunos de esos juegos que tienen recursos, o hay cuentas atrás, en realidad no hay AJAX detrás. El PHP cuando pinta la página, sabe a que ritmo estás generando recursos (y la fecha en milisegundos desde la última actualización de ese dato en la base de datos), asi que lo único que hace es meterte un javascript que te actualice la cantidad de recursos periódicamente teniendo en cuenta el tiempo que pasó desde la última actualización.
  #13 (permalink)  
Antiguo 19/10/2012, 12:04
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Producir un evento sin que se conecte el usuario

Muchas gracias de verdad. Esa era la respuesta que andaba buscando. En serio te estoy muy agradecido.
Ahora sino te importa un par de dudas.
Entonces, con debería usar el cronjob para el motor, y esto supongo que lo que debería hacer es actualizar la cantidad de recursos producidos, hacer las construcción, hacer los ataques y cosas por el estilo. ¿Estoy en lo cierto?

Luego, para poder programar un cronjob, ¿se necesita un servidor dedicado o un servicio de hosting normal te permite hacer esto?

En google he buscado lo del cronjob y he encontrado esto:
http://www.desarrolloweb.com/articulos/1744.php
http://net.tutsplus.com/tutorials/ph...bs-with-php-2/
Pero el problema es que el primero no se como aplicarlo bien a mi caso, y el segundo está en inglés y no entiendo nada. ¿Tú conoces alguno?

Yo tenía pensado eso que dices de que PHP sabe a que ritmo se producen los recursos y tal, de lo cual me debería ocupar con JavaScript, pero ¿tendré que coger esos datos de php para pasarlos a JS por ajax no?

Saludos y muchas gracias de nuevo.

PD: Gracias a ti también maycolalvarez.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #14 (permalink)  
Antiguo 19/10/2012, 12:22
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Producir un evento sin que se conecte el usuario

Un hosting normal (host compartido) vale. El mio es de redcoruna, 5 euros al mes, y puedo poner todos los cronjob que quiera. Y si, ese PHP deberá gestionar toda la logica del juego. Pero el código puede estar repartido en varios ficheros de PHP, lo ideal sería que usaras PHP orientado a objetos (clases).
Sólo necesitaras un php (por ejemplo, MAIN.PHP) que será el que incluya y utilize a todas las demás clases.

En cuanto a la segunda pregunta, te estás liando otra vez. No utilices ajax.
Por ejemplo, el juego tiene madera, y yo produzco 1 de madera cada segundo.

A las 12:01 el cronjobs ejecuta el MAIN.PHP. Entre otras cosas, se encarga de actualizar los recursos de cada jugador.
En diferentes tablas, el php sabe que yo produzco 60 de madera, y ve que la ultima actualizacion que hizo sobre mi tabla de recursos fue a las 12:00, y que entonces yo tenia 10 de madera.
Ha pasado un minuto, asi que el PHP me pone en la tabla correspondiente, que tengo 70 de madera a las 12:01.

En cuanto al PHP del cliente (jugador), cuando abre la pagina, verá la cantidad de recursos fija. Eso queda feo. Si quiere ver sus recursos actualizados, deberá refrescar la página de vez en cuando. Para evitar eso, cuando generes la página del jugador, también puedes generarle un script de javascript que con un setInterval ajustado al nivel que el usuario genera recursos. Es decir, cada segundo, que le sume 1 a la madera y se lo pinte en el DIV que sea.
Pero no manda nada por AJAX, el servidor ya sabe cómo actualizarle la madera al jugador cuando se ejecute el proximo ciclo del cronjob.

Todo esto debería de resultarte evidente. ¿Seguro que no es una tarea demasiado titánica hacer un juego de gestión de navegador? Podrías probar a hacer otras cosas menos complicadas antes para coger soltura.
  #15 (permalink)  
Antiguo 19/10/2012, 12:26
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Producir un evento sin que se conecte el usuario

Ya, eso del Ajax te lo digo para poder pintarle al usuario los recursos produce aunque sin metérselos en la tabla, necesito primero saber los datos de producción por hora y su cantidad. Para esto tengo que pasar la variable php producción madera a javascript para poder hacer dicho script.

Por cierto, conoces algun tutorial sobre lo del cronjob.

Saludos y gracias.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #16 (permalink)  
Antiguo 19/10/2012, 12:37
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Producir un evento sin que se conecte el usuario

Poner una tarea en el cronjobs es una chorrada.
Tu hosting te proporciona un panel de administración del hosting. Una de las pestañas será para cronjobs.
En la pestaña del cron jobs, escribes la orden, por ejemplo:
php public_html/miruta/miphp.php
Y eliges en un desplegable cada cuanto tiempo quieres que se ejecute dicha orden.

En cuanto a lo otro... Cuando PHP genera el HTML que mandará al navegador, puede escribir JAVASCRIPT.
Tu tendrás un funciones.js con funciones genéricas.
En la etiqueta <script></script> de la página generada por PHP, llamarás a esas funciones genéricas pero pasándole los datos correctos.
Igual que PHP genera un HTML personalizado, de la misma manera puede escribir un JavaScript personalizado.
  #17 (permalink)  
Antiguo 19/10/2012, 12:49
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Producir un evento sin que se conecte el usuario

¿Entonces puedo poner?
var a = <?php 3+1?>

¿Funcionará?
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #18 (permalink)  
Antiguo 19/10/2012, 12:56
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Producir un evento sin que se conecte el usuario

var a = <?php echo (3+1); ?>;

Genera -->

var a = 4;

Si esa cadena está dentro de un <script lang="javascript"></script>, habrá inicialmente una variable llamada "a" con el valor 4.

Javascript se ejecuta en el navegador... No tiene nada que ver con el PHP.
  #19 (permalink)  
Antiguo 19/10/2012, 14:35
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Producir un evento sin que se conecte el usuario

Ok, gracias por tu ayuda.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.

Etiquetas: evento, usuarios
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 12:34.