Pergunta

O site é http://www.ipalaces.org/support/

O uso I código para os indicadores de status é

<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 é uma coisa pura que big.oscar.aol.com permite que você faça, ele redireciona-lo para qualquer imagem que você tenha configurado para o on_url se eles estão online, e mesmo para off_url para offline. No entanto, eu quero usar isso em uma declaração se em PHP ou JavaScript para exibir coisas diferentes. Atualmente estou usando o seguinte:

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"; }

O problema com este código é que, por algum motivo, em momentos aleatórios que pode demorar até 12 segundos para que ela realmente recuperar os resultados. Considerando que o truque img padrão é quase instantânea.

Existe um problema conhecido com a onda? Existe uma maneira mais rápida?

Eu vi alguém tentar ler o .src da tag img e fazer uma declaração se assim, mas eu não poderia fazê-lo funcionar.

Foi útil?

Solução

Para evitar a espera para uma dúzia de segundos quando as coisas não estão indo bem, você pode definir mais algumas opções, como (ver curl_setopt ):

  • CURLOPT_CONNECTTIMEOUT: O número de segundos de espera ao tentar conectar. Use 0 para esperar indefinidamente.
    • defini-lo como um par de segundos seria suficiente
  • CURLOPT_TIMEOUT: O número máximo de segundos que uma função cURL para executar.
    • mesmo para um presente
  • CURLOPT_DNS_CACHE_TIMEOUT: O número de segundos para manter entradas DNS na memória. Esta opção é definida para 120 (2 minutos) por padrão.
    • Você provavelmente poderia definir isso para um maior valor

Se os usuários de seu site geralmente permanecer nele por mais do que apenas uma ou duas páginas, que poderia ser interessante para armazenar essa informação em $_SESSION, e só buscá-la de vez em quando.

Por exemplo, você pode buscá-lo somente se o valor armazenado na sessão tem sido buscada mais de 5 minutos atrás. Seria provavelmente salvar um casal de chamadas : -)


Uma outra forma poderia ser a de fazer isso no lado do cliente:

  • buscar a imagem com a tag <img>
  • em caso de "on-line", usar uma imagem que carrega OK
    • ligar um manipulador no "load" mesmo da imagem, para substituí-lo com algum texto
  • em caso de "offline", use uma imagem que está em 404
    • ligar um manipulador no "error" mesmo da imagem, para substituí-lo com algum texto

Isso não é muito bom (é uma espécie de "hacky", de forma errada), mas deve funcionar; -)

A sua imagem seria assim:

<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>

Você vê que, se o usuário estiver conectado, o <img>, finalmente, leva a uma imagem que existe; assim, o "load" mesmo vai ser despedido.

E, no caso o usuário não está conectado, o <img> vai finalmente levar a uma imagem que não existe (ele está dando um erro 404) ; assim, o evento "error" será demitido.

Você agora tem que cuidar desses dois casos, com algo parecido com isto:

<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>

Se status é 1, exibimos "Online", e, no outro caso ( "erro"), exibimos "Offline": -)

Mas, mesmo se ele parece estar funcionando, eu realmente não gosto dessa solução ^^

Outras dicas

+1 para Pascal para isso, mas para quem quer isso em PHP, e ainda está interessado, eu fiz um pequeno script que lida com a localização do cabeçalho (que retorna offline / online ou o que você colocar na ponta do o URL (por exemplo, on_url = 1, no cabeçalho voltaria Localização: 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top