2009-07-31 10 views
6

La página web es http://www.ipalaces.org/support/opción PHP o JavaScript para detectar el estado de AIM

El código que utilizo para los indicadores de estado es

<img src="http://big.oscar.aol.com/imperialpalaces?on_url=http://www.ipalaces.org/support/widget/status_green.gif&off_url=http://www.ipalaces.org/support/widget/status_offline.gif"> 

que es una linda cosa que le deja big.oscar.aol.com do, lo redirige a la imagen que haya configurado para on_url si están en línea, y lo mismo para off_url para fuera de línea. Sin embargo, quiero usar esto en una declaración if en PHP o Javascript para mostrar cosas diferentes. Actualmente estoy usando esto:

function getaim($screenname) { 
     $ch  = curl_init(); 
     $url = "http://big.oscar.aol.com/$screenname?on_url=true&off_url=false"; 
     curl_setopt($ch, CURLOPT_URL,$url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
     // added to fix php 5.1.6 issue: 
     curl_setopt($ch, CURLOPT_HEADER, 1); 
     $result = curl_exec($ch); 
     curl_close($ch); 

     if(eregi("true",$result)) { 
      return true; 
     } else { 
      return false; 
     } 
} 

If (getaim("ImperialPalaces")) { print "Online"; } else { print "Offline"; } 

El problema con este código es que por alguna razón, a veces al azar que puede tomar hasta 12 segundos para que se recupere en realidad los resultados. Mientras que el truco de img estándar es casi instantáneo.

¿Existe un problema conocido con curl? ¿Hay una manera mas rápida?

He visto a alguien tratar de leer el .src de la etiqueta img y hacer una declaración if como esa, pero no pude hacer que funcione.

Respuesta

4

Para evitar la espera de una decena de segundos cuando las cosas no están haciendo bien, se puede ajustar un par de opciones, como (ver curl_setopt):

  • CURLOPT_CONNECTTIMEOUT: El número de segundos de espera al intentar conectarse . Use 0 para esperar indefinidamente.
    • estableciéndolo en un par de segundos sería suficiente
  • CURLOPT_TIMEOUT: El número máximo de segundos para permitir que las funciones CURL a ejecutar.
    • mismo para éste
  • CURLOPT_DNS_CACHE_TIMEOUT: El número de segundos que se mantienen las entradas DNS en memoria. Esta opción está configurada en 120 (2 minutos) por defecto.
    • Es probable que se pueda establecer a un valor más alto

Si los usuarios de su sitio web por lo general permanecen en él durante más de sólo una o dos páginas, que podría ser interesante para almacenar esa información en $_SESSION, y solo búscalo de vez en cuando.

Por ejemplo, podría obtenerlo solo si el valor almacenado en la sesión se ha obtenido hace más de 5 minutos.Probablemente sería ahorrar un par de llamadas :-)


Otra forma podría ser la de hacer eso en el lado del cliente:

  • buscar la imagen con la etiqueta <img>
  • en caso de "en línea", utilice una imagen que cargue OK
    • conecte un controlador en el "load" incluso de la imagen, para reemplazarlo por un texto
  • en caso de "fuera de línea", utilice una imagen que está en 404
    • conectar un controlador en el "error" incluso de la imagen, para reemplazarlo con algo de texto

Eso no es muy agradable (que es una especie de "hacky", en el sentido contrario), pero debería funcionar ;-)

Su imagen sería así:

<div id="arround-1"> 
    <img id="img-1" src="http://big.oscar.aol.com/imperialpalaces?on_url=http://www.ipalaces.org/support/widget/status_green.gif&amp;off_url=http://this.is-a-404-error.com" 
     onload="replace_img_status(1, 1);" 
     onerror="replace_img_status(1, 0);" 
    /> 
</div> 

Verá que, si el usuario está conectado, el <img> finalmente conduce a una imagen que existe; por lo tanto, el "load" incluso se disparará.

Y, en el caso de que el usuario no está conectado, el <img> conducirá finalmente a una imagen que no existe (se da un error 404); por lo tanto, se desencadenará el evento "error".

Ahora tiene que cuidar de esos dos casos, con algo como esto:

<script type="text/javascript"> 
    var replace_img_status = function (num, status) { 
     var div = document.getElementById('arround-' + num); 
     if (div) { 
      if (status == 1) { 
       div.innerHTML = 'Online'; 
      } else { 
       div.innerHTML = 'Offline'; 
      } 
     } 
    }; 
</script> 

Si status es 1, se muestra "en línea", y, en el otro caso ("error"), mostramos "fuera de línea" :-)

pero, aún es que parece estar funcionando, no me gusta mucho esa solución ^^

1

1 a Pascal para eso, sino para cualquier persona que quiera en este PHP, y todavía está interesado, he hecho un pequeño script que maneja el hea der ubicación (que devuelve fuera de línea/en línea o lo que sea que coloque al final de la URL (Por ejemplo, on_url = 1, en el encabezado volvería Ubicación: 1)

<?php 
Define('Username', $_GET['sn']); 
Define('URL', 'http://big.oscar.aol.com/' . Username . '?on_url=online&off_url=offline'); 
Define('Online', 'Location: online'); // Change online to whatever you have for on_url 
Define('Offline', 'Location: offline'); // Change offline to whatever you have for off_url 

$Response = Get_Headers(URL); 

If(In_Array(Online, $Response)){ 
    Echo UCWords(StrToLower(Username)) . ' is currently online.'; 
} 
ElseIf(In_Array(Offline, $Response)){ 
    Echo UCWords(StrToLower(Username)) . ' is currently offline, or has set their privacy settings.'; 
} 
?> 
Cuestiones relacionadas