Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/08/2012, 02:25
juan09
 
Fecha de Ingreso: octubre-2009
Mensajes: 51
Antigüedad: 15 años, 2 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();
 
?>