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();
?>