Foros del Web » Programando para Internet » Jquery »

Subastas Comet Jquery simultaneas

Estas en el tema de Subastas Comet Jquery simultaneas en el foro de Jquery en Foros del Web. Hola, estoy haciendo una web de subastas, debido a la sobrecarga de la CPU, en este foro me aconsejaron utilizar Comet, he adaptado un código ...
  #1 (permalink)  
Antiguo 31/08/2012, 02:25
 
Fecha de Ingreso: octubre-2009
Mensajes: 51
Antigüedad: 14 años, 5 meses
Puntos: 3
Subastas Comet Jquery simultaneas

Hola, estoy haciendo una web de subastas, debido a la sobrecarga de la CPU, en este foro me aconsejaron utilizar Comet, he adaptado un código de un chat (que no llego a entender al 100%

Funciona bien, no hay problemas con el server, el unico problema es que si dos usuarios pujan simultaneamente o con una diferencia de menos de un segundo, pujan por el mismo precio, cosa inviable

He probado todo, desactivar el boton unos segundos, evaluar el tiempo transcurrido, hacer sleep(), pero nada. Os dejo el codigo que a mas de uno le sonará
Código:
<script type="text/javascript">
// comet implementation
var Comet = function (id_subasta) {
  this.timestamp = 0;
  this.url = './backend.php?id_subasta='+id_subasta;  
  this.noerror = true;

  this.connect = function() {
    var self = this;

    $.ajax({
      type : 'get',
      url : this.url,
      dataType : 'json', 
      data : {'timestamp' : self.timestamp},
      success : function(response) {
        self.timestamp = response.timestamp;
        self.handleResponse(response);
        self.noerror = true;          
      },
      complete : function(response) {
        // send a new ajax request when this request is finished
        if (!self.noerror) {
          // if a connection problem occurs, try to reconnect each 5 seconds
          setTimeout(function(){ comet.connect(); }, 5000);           
        }else {
          // persistent connection
          self.connect(); 
        }

        self.noerror = false; 
      }
    });
  }

  this.disconnect = function() {}

  this.handleResponse = function(response) {
	  var dineros = Number(response.msg);
	  dineros = dineros+0.5;
	//$('#'+id_subasta).append('<div>' + dineros + '</div>');
	//$('#'+id_subasta).html('<div>Precio actual: ' + dineros + '€</div>');
	$('#submit'+id_subasta).attr('value', 'Pujar por '+ dineros + '€');
	$('#word'+id_subasta).attr('value', dineros);
  }

  this.doRequest = function(request) {
	
	var precio = request  
   //if (confirm("Vas a pujar por " + precio +" € ¿Estás seguro?")) {
	   
	  var email_usuario = fb.user.email;
	  $('#mensaje'+id_subasta).load("procesar_puja2.php?email_usuario="+email_usuario+"&id_subasta="+id_subasta+"&precio="+precio);
	  
	  
      $.ajax({
        type : 'get',
        url : this.url,
        data : {'msg' : request}
      });
	  
   //}else{return false;}//fin de confirm


	
	  
  }//fin  de do request

}


</script>

<script type="text/javascript">
var comet<? echo $id_subasta ?> = new Comet('<? echo $id_subasta ?>');
comet<? echo $id_subasta ?>.connect();
</script>
y backend.php

Código PHP:
<?php
  
  $ruta_txt 
'subastas/cache/'.$_GET['id_subasta'].'.txt';
  
$filename  $ruta_txt;
 
// almacenamos un nuevo mensajes en el archivo 
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if (
$msg != '')
{
   
  
//file_put_contents -> escribir una cadena sobre un archivo
  
file_put_contents($filename,$msg);
  die();
  


}

// bucle infinito mientras los datos del archivo no son modificados
$lastmodif    = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
//filemtime -> obtiene la hora de modificación del archivo
$currentmodif filemtime($filename);
while (
$currentmodif <= $lastmodif// verificar si el archivo de datos ha sido modificado
{  
  
usleep(10000); // hacemos descansar al CPU por 10ms
  
clearstatcache(); //clearstatcache -> limpia la cache de estado de un archivo
  
$currentmodif filemtime($filename);

}

// devolvemos array en formato json
$response = array();
//file_get_contents -> lee un archivo entero en una cadena
$response['msg']       = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo 
json_encode($response);
//flush -> vaciar el búfer de salida
flush();
 
?>
  #2 (permalink)  
Antiguo 31/08/2012, 02:40
Avatar de YYs86  
Fecha de Ingreso: abril-2012
Ubicación: Salamanca
Mensajes: 136
Antigüedad: 11 años, 11 meses
Puntos: 14
Respuesta: Subastas Comet Jquery simultaneas

Juraría que tienes que hacerlo a nivel del servidor... meterle una bandera de "puja en uso" en la bbdd, ya que si lo haces a nivel de javascript la interactuación entre ambos usuarios no se realiza
__________________
Web developer:

http://xtremgaming.es
http://leaderleague.com
  #3 (permalink)  
Antiguo 31/08/2012, 03:10
 
Fecha de Ingreso: octubre-2009
Mensajes: 51
Antigüedad: 14 años, 5 meses
Puntos: 3
Respuesta: Subastas Comet Jquery simultaneas

Hola, gracias por tu respuesta

Te refieres a un campo en la bd, que se actualice a cada puja con valores 'en uso' o 'libre'? Lo probaré aunque a simple vista no me parece una solucion muy ortodoxa,
  #4 (permalink)  
Antiguo 31/08/2012, 06:07
Avatar de YYs86  
Fecha de Ingreso: abril-2012
Ubicación: Salamanca
Mensajes: 136
Antigüedad: 11 años, 11 meses
Puntos: 14
Respuesta: Subastas Comet Jquery simultaneas

Si me refiero a eso, necesitas tener un campo para que no puedan acceder dos personas sobre la misma puja al mismo tiempo (lo que tarde en realizar tu insert/update) y así no se solapen pujas con el mismo valor...
__________________
Web developer:

http://xtremgaming.es
http://leaderleague.com

Etiquetas: ajax, comet, funcion, html, javascript, js, php, simultaneas, subastas
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 15:04.