2009-07-31 12 views
6

Le site est http://www.ipalaces.org/support/javascript ou option PHP pour détecter l'état AIM

Le code que j'utilise pour les indicateurs d'état est

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

qui est une chose intéressante qui vous permet de big.oscar.aol.com faire, il le redirige vers n'importe quelle image que vous avez définie pour le on_url si elles sont en ligne, et même pour off_url hors ligne. Cependant, je veux l'utiliser dans une instruction if en PHP ou javascript pour afficher différentes choses. Actuellement, je suis en utilisant ceci:

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

Le problème avec ce code est que, pour une raison quelconque, à des moments aléatoires, il peut prendre jusqu'à 12 secondes pour récupérer effectivement les résultats. Alors que l'astuce img standard est presque instantanée.

Y at-il un problème connu avec curl? Y at-il un moyen plus rapide?

J'ai vu quelqu'un essayer de lire le fichier .src de la balise img et faire une instruction si comme ça, mais je ne pouvais pas le faire fonctionner.

Répondre

4

Pour éviter d'attendre une dizaine de secondes quand les choses ne vont pas bien, vous pouvez définir deux plus d'options, comme (voir curl_setopt):

  • CURLOPT_CONNECTTIMEOUT: Le nombre de secondes d'attente tout en essayant de se connecter . Utilisez 0 pour attendre indéfiniment.
    • mise à quelques secondes serait assez
  • CURLOPT_TIMEOUT: Le nombre maximum de secondes pour permettre aux fonctions cURL d'exécuter.
    • même pour celui-ci
  • CURLOPT_DNS_CACHE_TIMEOUT: Le nombre de secondes pour garder les entrées DNS en mémoire. Cette option est définie sur 120 (2 minutes) par défaut.
    • Vous pourriez probablement mettre cela à une valeur plus élevée

Si les utilisateurs de votre site Web restent généralement pour plus que seulement une ou deux pages, il pourrait être intéressant de stocker ces informations dans $_SESSION, et seulement le chercher de temps en temps. Par exemple, vous pouvez l'extraire uniquement si la valeur stockée dans la session a été récupérée il y a plus de 5 minutes.Il serait probablement sauver quelques appels :-)


Une autre façon peut-être de le faire sur le côté client:

  • chercher l'image avec l'étiquette <img>
  • dans le cas de "en ligne", utilisez une image qui charge OK
    • branchez un gestionnaire sur le "load" même de l'image, pour le remplacer par texte
  • en cas de « hors ligne », utiliser une image qui est en 404
    • brancher un gestionnaire sur la « error » même de l'image, de le remplacer par un texte

ce n'est pas très agréable (il est une sorte de « aki », dans le mauvais sens), mais il devrait fonctionner ;-)

Votre image serait comme ceci:

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

Vous voyez que, si l'utilisateur est connecté, le <img> conduit finalement à une image qui existe; Ainsi, le "load" sera même tiré.

Et, dans le cas où l'utilisateur n'est pas connecté, le <img> conduira finalement à une image qui n'existe pas (elle donne une erreur 404); Ainsi, l'événement "error" sera déclenché.

Vous devez maintenant prendre soin de ces deux cas, quelque chose comme ceci:

<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 est 1, nous affichons « en ligne », et, dans l'autre cas (« erreur »), nous affichons « Offline » :-)

mais, est-il même semble fonctionner, je ne aime pas vraiment cette solution ^^

1

+1 à Pascal pour cela, mais pour tous ceux qui veulent cela dans PHP, et est toujours intéressé, j'ai fait un petit script qui gère le hea der location (qui renvoie hors ligne/en ligne ou tout ce que vous mettez à la fin de l'URL (Par exemple, on_url = 1, dans l'en-tête renverrait Emplacement: 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.'; 
} 
?>