2009-07-31 10 views
6

Il sito è http://www.ipalaces.org/support/javascript o PHP opzione per rilevare lo stato AIM

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 semplice che consente di big.oscar.aol.com fallo, lo reindirizza a qualunque immagine tu abbia impostato per on_url se sono online, e lo stesso per off_url per offline. Tuttavia, voglio usare questo 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, a volte casuali possono essere necessari fino a 12 secondi per recuperare effettivamente i risultati. Considerando che il trucco img standard è quasi istantaneo.

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

Ho visto qualcuno provare a leggere il file .src del tag img e fare un'istruzione if in questo modo, ma non riuscivo a farlo funzionare.

risposta

4

Per evitare di attesa per una decina di secondi, quando le cose non stanno facendo bene, è possibile impostare un altro paio di opzioni, come (vedi curl_setopt):

  • CURLOPT_CONNECTTIMEOUT: Il numero di secondi di attesa durante il tentativo di connessione . Usa 0 per aspettare indefinitamente.
    • impostandolo a un paio di secondi sarebbe sufficiente
  • CURLOPT_TIMEOUT: Il numero massimo di secondi per consentire funzioni CURL di eseguire.
    • stesso per questo
  • CURLOPT_DNS_CACHE_TIMEOUT: Il numero di secondi per mantenere voci DNS in memoria. Questa opzione è impostata su 120 (2 minuti) per impostazione predefinita.
    • Probabilmente si può impostare a un valore più alto

Se gli utenti del tuo sito web in genere rimangono su di esso per più di solo uno o due pagine, potrebbe essere interessante per memorizzare le informazioni in $_SESSION, e lo prelevi solo una volta ogni tanto.

Ad esempio, è possibile recuperarlo solo se il valore memorizzato nella sessione è stato recuperato più di 5 minuti fa.Sarebbe probabilmente salvare un paio di chiamate :-)


Un altro modo potrebbe essere quello di fare che sul lato client:

  • recuperare l'immagine con il tag <img>
  • in caso di "online", utilizzare un'immagine che carica OK
    • collegare un gestore sullo "load" anche dell'immagine, per sostituirlo con un testo
  • in caso di "non in linea", utilizzare un'immagine che è in 404
    • collegare un gestore sul "error", anche di immagine, per sostituirlo con un testo

questo non è molto bello (è una specie di "hacky", in modo sbagliato), ma dovrebbe funzionare ;-)

l'immagine sarebbe come questo:

<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, lo <img> conduce infine a un'immagine esistente; così, anche il "load" verrà licenziato.

E, nel caso l'utente non è collegato, il <img> sarà finalmente portare a un'immagine che non esiste (è dare un errore 404); quindi, verrà generato l'evento "error".

Ora avete a prendersi cura di questi due casi, con qualcosa di simile:

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

ma, anche è sembra funzionare, non mi piace molto questa soluzione ^^

1

+1 a Pascal per questo, ma per chi vuole questo PHP, ed è ancora interessato, ho realizzato un piccolo script che gestisce il problema der location (che ritorna offline/online o qualunque cosa tu abbia inserito alla fine dell'URL (Ad esempio, on_url = 1, nell'intestazione restituisce 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.'; 
} 
?> 
Problemi correlati