Domanda

Il sito web è http://www.ipalaces.org/support/

Il codice che uso per gli indicatori di stato è

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

che è una cosa ordinata che big.oscar.aol.com ti consente di fare, lo reindirizza a qualsiasi immagine che hai impostato per on_url se sono online, e lo stesso vale per off_url per offline. Tuttavia, voglio usarlo in un'istruzione if in PHP o javascript per visualizzare cose diverse. Attualmente sto usando questo:

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

Il problema con questo codice è che per qualche motivo, in momenti casuali, possono essere necessari fino a 12 secondi per recuperare effettivamente i risultati. Considerando che il trucco img standard è quasi istantaneo.

Esiste un problema noto con l'arricciatura? C'è un modo più veloce?

Ho visto qualcuno provare a leggere il .src del tag img e fare un'istruzione if come quella, ma non sono riuscito a farlo funzionare.

È stato utile?

Soluzione

Per evitare di aspettare una dozzina di secondi quando le cose non vanno bene, puoi impostare un paio di opzioni in più, come (vedi curl_setopt ):

  • CURLOPT_CONNECTTIMEOUT: il numero di secondi di attesa durante il tentativo di connessione. Usa 0 per attendere indefinitamente.
    • impostarlo su un paio di secondi sarebbe sufficiente
  • CURLOPT_TIMEOUT: il numero massimo di secondi per consentire l'esecuzione delle funzioni cURL.
    • lo stesso per questo
  • CURLOPT_DNS_CACHE_TIMEOUT: il numero di secondi per conservare le voci DNS in memoria. Questa opzione è impostata su 120 (2 minuti) per impostazione predefinita.
    • Probabilmente potresti impostarlo su un valore più alto

Se gli utenti del tuo sito Web rimangono generalmente su di esso per più di una o due pagine, potrebbe essere interessante archiviare tali informazioni in $_SESSION e recuperarle solo una volta ogni tanto.

Ad esempio, potresti recuperarlo solo se il valore memorizzato nella sessione è stato recuperato più di 5 minuti fa. Probabilmente salverebbe un paio di chiamate :-)


Un altro modo potrebbe essere quello di farlo sul lato client:

  • recupera l'immagine con il <img> tag
  • in caso di " online " usa un'immagine che carica OK
    • collega un gestore al " load " anche dell'immagine, per sostituirla con del testo
  • in caso di " offline " ;, usa un'immagine che si trova in 404
    • collega un gestore al " error " anche dell'immagine, per sostituirla con del testo

Non è molto carino (è una specie di " hacky " ;, nel modo sbagliato), ma dovrebbe funzionare ;-)

La tua immagine sarebbe così:

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

Si vede che, se l'utente è connesso, status porta infine a un'immagine esistente; quindi, " 1 " anche sarà licenziato.

E, nel caso in cui l'utente non sia connesso, <=> alla fine porterà a un'immagine che non esiste (sta dando un errore 404) ; quindi, " <=> " l'evento verrà generato.

Ora devi occuparti di questi due casi, con qualcosa del genere:

<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 <=> è <=>, visualizziamo " Online " ;, e, nell'altro caso (" errore "), visualizziamo quot; Offline <> quot!; : -)

Ma, anche se sembra funzionare, non mi piace molto quella soluzione ^^

Altri suggerimenti

+1 a Pascal per questo, ma per chiunque lo desideri in PHP, ed è ancora interessato, ho realizzato un piccolo script che gestisce la posizione dell'intestazione (che ritorna offline / online o qualunque cosa tu abbia messo alla fine di l'URL (ad esempio, on_url = 1, nell'intestazione restituirà Location: 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.';
}
?>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top