2009-07-31 11 views
6

Strona jest http://www.ipalaces.org/support/javascript lub opcja PHP do wykrywania stanu AIM

Kod używam dla wskaźników stanu jest

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

który jest schludny rzeczą, która pozwala Ci big.oscar.aol.com do, przekierowuje go do dowolnego obrazu, który ustawiłeś dla on_url, jeśli są online, i to samo dla off_url dla trybu offline. Jednak chcę użyć tego w instrukcji if w PHP lub javascript, aby wyświetlić różne rzeczy. Obecnie używam to:

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

problem z tym kodem jest, że z jakiegoś powodu, losowo razy to może trwać do 12 sekund na to, aby faktycznie odzyskać wyniki. Podczas gdy standardowa sztuczka img jest prawie natychmiastowa.

Czy znany jest problem zwijania? Czy jest szybszy sposób?

Widziałem, jak ktoś próbował odczytać .src z tagu img i zrobić takie oświadczenie, ale nie mogłem go uruchomić.

Odpowiedz

4

Aby uniknąć oczekiwania na kilkanaście sekund, gdy rzeczy nie robią OK, można ustawić kilka dodatkowych opcji, takich jak (patrz curl_setopt):

  • CURLOPT_CONNECTTIMEOUT: Liczba sekund oczekiwania podczas próby połączenia . Użyj 0, aby czekać w nieskończoność.
    • ustawienie go na kilka sekund wystarczy
  • CURLOPT_TIMEOUT: Maksymalna liczba sekund, aby umożliwić funkcje cURL do wykonania.
    • same dla tej jednej
  • CURLOPT_DNS_CACHE_TIMEOUT: liczba sekund, aby utrzymać wpisy DNS w pamięci. Ta opcja jest domyślnie ustawiona na 120 (2 minuty).
    • Można prawdopodobnie ustawić na wyższą wartość

Jeśli użytkownicy witryny ogólnie pobyt na nim dłużej niż tylko jedną lub dwie strony, to może być ciekawe do przechowywania tych informacji w $_SESSION i tylko pobierać je od czasu do czasu.

Na przykład można pobrać tylko wtedy, gdy wartość przechowywana w sesji została pobrana ponad 5 minut temu.Prawdopodobnie zaoszczędzić parę rozmów :-)


jeden inny sposób, może być to zrobić na stronie klienta:

  • pobrać obraz z tagiem <img>
  • w przypadku "online" użyj obrazu, który ładuje OK
    • podłącz nośnik na "load" nawet obrazu, aby zastąpić go jakiś tekst
  • w przypadku „offline”, użyć obrazu, który jest w 404
    • podłączyć obsługi na „error” jeszcze obrazu, aby zastąpić go jakimś tekstem

to nie jest bardzo ładne (jest to rodzaj „hacky”, w niewłaściwy sposób), ale to powinno działać ;-)

Twój obraz będzie tak:

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

Widzisz, jeśli użytkownik jest podłączony, <img> w końcu prowadzi do istniejącego obrazu; więc "load" nawet zostanie zwolniony.

W przypadku, gdy użytkownik nie jest podłączony, <img> doprowadzi w końcu do obrazu, który nie istnieje (daje to błąd 404); więc zdarzenie "error" zostanie wyrzucone.

Teraz trzeba zadbać o tych dwóch przypadkach, z czymś takim:

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

Jeśli status jest 1, wyświetlamy „online”, a w drugim przypadku („błąd”), wyświetlimy „offline” :-)

ale nawet to wydaje się działać, ja nie lubię tego rozwiązania ^^

1

+1 do Pascala za to, ale dla każdego, kto chce w ten PHP, i nadal jest zainteresowany, zrobiłem mały skrypt, który zajmuje się hea der location (która zwraca offline/online lub cokolwiek umieścisz na końcu adresu URL (na przykład on_url = 1, w nagłówku powrócił Lokalizacja: 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.'; 
} 
?> 
Powiązane problemy