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:
y backend.php<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>
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();
?>