Pregunta

El sitio web es de http://www.ipalaces.org/support/

El código que uso 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 cosa clara que big.oscar.aol.com te permite hacer, se le redirige a cualquier imagen que se haya establecido para el on_url si están en línea, y lo mismo off_url sin conexión.Sin embargo, quiero usar esto en una instrucción if en PHP o javascript para mostrar cosas diferentes.Actualmente estoy usando esta:

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, se puede tomar hasta 12 segundos para que realmente para recuperar los resultados.Mientras que el standard img truco es casi instantánea.

Hay un problema conocido con curl?Es allí una manera más rápida?

He visto a alguien intente leer .src de la etiqueta img y hacer una declaración de si el estilo, pero yo no podía llegar a trabajar.

¿Fue útil?

Solución

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

  • CURLOPT_CONNECTTIMEOUT :El número de segundos de espera mientras se intenta conectar.El uso de 0 a esperar indefinidamente.
    • ajuste a un par de segundos sería suficiente
  • CURLOPT_TIMEOUT :El número máximo de segundos para permitir que el cURL de las funciones a ejecutar.
    • mismo para este
  • CURLOPT_DNS_CACHE_TIMEOUT :El número de segundos para mantener las entradas DNS en la memoria.Esta opción se establece en 120 (2 minutos) de forma predeterminada.
    • Probablemente se podría establecer a un valor más alto

Si los usuarios de su sitio web en general permanecer en él por más de sólo una o dos páginas, que puede ser interesante para almacenar esa información en $_SESSION, y sólo ir de vez en cuando.

Por ejemplo, usted podría ir sólo si el valor almacenado en la sesión se han recuperado más de 5 minutos.Probablemente sería guardar un par de llamadas :-)


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

  • captura de la imagen con la <img> etiqueta
  • en el caso de "en línea", el uso de una imagen que se carga OK
    • conecte un controlador en el "load"de la imagen, para reemplazarlo con algún texto
  • en el caso de "fuera de línea", el uso de una imagen que está en 404
    • conecte un controlador en el "error"de la imagen, para reemplazarlo con algún texto

Eso no es muy agradable (es una especie de "chapucero", en el mal sentido), pero se debe trabajar ;-)

La imagen podría ser como esta :

<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ás que, si el usuario está conectado, el <img> finalmente conduce a una imagen que no existe ;así, el "load"incluso sería despedido.

Y, en el caso de que el usuario no está conectado, el <img> le conducirá finalmente a una imagen que no existe (se está dando un error 404) ;así, el "error"evento será disparado.

Ahora tienes que cuidar de los 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, aparece "en Línea", y, en el otro caso ("error"), aparece "Desconectado" :-)

Pero, incluso es parece estar funcionando, no me gusta que la solución ^^

Otros consejos

+1 a Pascal por eso, pero para cualquiera que quiera esto en PHP y todavía esté interesado, he creado un pequeño script que maneja la ubicación del encabezado (que regresa sin conexión / en línea o lo que sea que ponga al final de la URL (por ejemplo, on_url = 1, en el encabezado devolverí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.';
}
?>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top