Ver Mensaje Individual
  #4 (permalink)  
Antiguo 24/03/2009, 03:09
Avatar de ZiTAL
ZiTAL
 
Fecha de Ingreso: marzo-2004
Ubicación: Bermio (Bizkaia)
Mensajes: 1.545
Antigüedad: 20 años, 8 meses
Puntos: 62
Respuesta: ejemplo de Comet con PHP: long polling

Bueno seguimos con esto, ahora haremos que haga recursivamente con retardos de tiempo, porque? Porque sino se bloquearia el navegador, el servidor o los 2 ;):

Código javascript:
Ver original
  1. var xmlhttp = function()
  2.     {
  3.         var a;try{a = new XMLHttpRequest();}
  4.         catch(e){try{a = new ActiveXObject('Msxml2.XMLHTTP');}
  5.         catch(e){try{a = new ActiveXObject('Microsoft.XMLHTTP');}
  6.         catch(e){alert('Your browser doesn\'t support ajax');a=false;}
  7.         }}return a;
  8.     }; 
  9.     window.onload = function()
  10.     {
  11.         var a = new comet();
  12.     }; 
  13.     var comet = function()
  14.     {
  15.         var a = new xmlhttp();
  16.         a.open('post',window.location+"?"+Math.random()+"="+Math.random(), true);
  17.         a.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  18.         a.onreadystatechange = function()
  19.         {
  20.             if(a.readyState == 4)
  21.             {
  22.                 document.getElementById('content').innerHTML = a.responseText;
  23.                 window.setTimeout(function(){
  24.                     a = new comet();                   
  25.                 },1000);
  26.                
  27.             }
  28.         };
  29.         a.send('algo=algo');               
  30.     };

Solamente con añadir un timeout ya conseguimos ese efecto, en este caso hemos puesto como parametro 1000 ya que el valor hay que ponerlo en milisegundos ;)

Ahora de la parte de PHP:
Código PHP:
<?php
if($_POST)  
{
    
set_time_limit(0);    
    
header("Edge-control: no-store");
    
sleep(1);
    
$content trim(file_get_contents('content.txt'));
    while(
$content=='')
    {
        
sleep(1);
        
$content trim(file_get_contents('content.txt'));
    }
    echo 
$content;
    exit();
}
?>
con sleep conseguimos parar el tiempo en segundos antes de proseguir con la ejecución, también tenemos su equivalente en microsegundos que es el usleep, en nuestro caso:

Código PHP:
<?php
if($_POST)  
{
    
set_time_limit(0);    
    
header("Edge-control: no-store");
    
usleep(1000);
    
$content trim(file_get_contents('content.txt'));
    while(
$content=='')
    {
        
usleep(1000);
        
$content trim(file_get_contents('content.txt'));
    }
    echo 
$content;
    exit();
}
?>
__________________
http://zital.no-ip.org
____________________

Euskerie ahuen eta bijotzan

Última edición por ZiTAL; 24/03/2009 a las 03:36