cURL Timeout beim Abfragen von Messenger-Online-Status scheint nicht zu funktionieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • cURL Timeout beim Abfragen von Messenger-Online-Status scheint nicht zu funktionieren

    Hi.

    Hab folgendes Script für die Benutzerprofile meines Forums laufen. Es überprüft den Online Status von ICQ, YIM, AIM, WLM und Skype. Der Timeout (250ms pro URL) ist insbesondere dank des lahmen ICQ-Servers recht wichtig. Aber irgendwie scheint dieser nicht zu greifen: Manche Profile brauchen Minuten, bis sie geladen sind.

    Für eine paar Tipps wär ich euch sehr dankbar!

    [ edit, siehe Post #3 ]
    PHP-Code:
    function aimyim_status($id,$host) {
        if (
    $id === '') return;

        switch (
    $host) {
            case 
    'yahoo':
                
    $url 'http://opi.yahoo.com/online?u='.$id.'&m=a&t=1'; break;
            case 
    'aim':
                
    $url 'http://big.oscar.aol.com/'.$id.'?on_url=true&off_url=false'; break;
            case 
    'icq':
                
    $url 'http://status.icq.com/online.gif?icq='.$id; break;
            case 
    'msn':
                
    $url 'http://messenger.services.live.com/users/'.$id.'/presence'; break;
            case 
    'skype':
                
    $url 'http://mystatus.skype.com/'.$id.'.num'; break;
            default:
                return; 
    // unknown host
        
    }

        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT_MS100);
        
    curl_setopt($chCURLOPT_TIMEOUT_MS250);
        
    curl_setopt($chCURLOPT_DNS_CACHE_TIMEOUT5);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_HEADER1);
        
    $result trim(curl_exec($ch));

        if (
    $result == '') return 'unknown';

        switch (
    $host) {
            case 
    'yahoo':
                
    $online $result != '00'; break;
            case 
    'aim':
                
    $online stripos($result'true'); break;
            case 
    'icq':
                
    $online stripos($result'online1'); break;
             case 
    'msn':
                
    $online stripos($result'offline') === false; break;
             case 
    'skype':
                
    $online intval($result) == 1; break;
        }

        return 
    $online 'online' 'offline';

    Zuletzt geändert von baerenwurm; 25.02.2011, 14:52.

  • #2
    Hallo,

    du solltest zuerst herausfinden, welcher Request am längsten dauert und dann ermitteln, ob die Verbindungszeit, die Antwortzeit oder die Übertragungsrate das Problem ist. Dein Code ist übrigens hochgradig wiederholend. Schreib doch besser eine Funktion dafür.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Wenn wir das erstmal refaktorieren, wird es deutlich kürzer und deine Chancen steigen, dass es sich jemand durchliest.
      PHP-Code:
      function aimyim_status($id,$host) {
          if (
      $id === '') return;

          switch (
      $host) {
              case 
      'yahoo'$url 'http://opi.yahoo.com/online?u='.$id.'&m=a&t=1'; break;
              case 
      'aim':   $url 'http://big.oscar.aol.com/'.$id.'?on_url=true&off_url=false'; break;
              case 
      'icq':   $url 'http://status.icq.com/online.gif?icq='.$id; break;
              case 
      'msn':   $url 'http://messenger.services.live.com/users/'.$id.'/presence'; break;
              case 
      'skype'$url 'http://mystatus.skype.com/'.$id.'.num'; break;
              default: return; 
      // unknown host
          
      }

          
      $ch curl_init();
          
      curl_setopt($chCURLOPT_URL$url);
          
      curl_setopt($chCURLOPT_CONNECTTIMEOUT_MS100);
          
      curl_setopt($chCURLOPT_TIMEOUT_MS250);
          
      curl_setopt($chCURLOPT_DNS_CACHE_TIMEOUT5);
          
      curl_setopt($chCURLOPT_RETURNTRANSFER1);
          
      curl_setopt($chCURLOPT_HEADER0);
          
      $result trim(curl_exec($ch));

          if (
      $result == '') return 'unknown';

          switch (
      $host) {
              case 
      'yahoo'$online $result == '00'; break;
              case 
      'aim':   $online stripos($result'true'); break;
              case 
      'icq':   $online stripos($result'online1'); break;
              case 
      'msn':   $online stripos($result'offline') === false; break;
              case 
      'skype'$online intval($result) == 1; break;
          }

          return 
      $online 'online' 'offline';

      Zuletzt geändert von onemorenerd; 25.02.2011, 14:37.

      Kommentar


      • #4
        Wow, der Code (#1) wurde wohl mit einer Guttenberg-Tastatur geschrieben.

        Kommentar


        • #5
          Zitat von AmicaNoctis Beitrag anzeigen
          Hallo,

          du solltest zuerst herausfinden, welcher Request am längsten dauert und dann ermitteln, ob die Verbindungszeit, die Antwortzeit oder die Übertragungsrate das Problem ist.
          Ok, danke.

          Dein Code ist übrigens hochgradig wiederholend
          Aber abgesehen davon müsste doch eigentlich passen, oder?

          Zitat von h3ll Beitrag anzeigen
          Wow, der Code wurde wohl mit einer Guttenberg-Tastatur geschrieben.
          Haha, in der Tat (halb).

          Zitat von onemorenerd Beitrag anzeigen
          Wenn wir das erstmal refaktorieren, wird es deutlich kürzer und deine Chancen steigen, dass es sich jemand durchliest.
          Danke!

          Kommentar


          • #6
            Zitat von onemorenerd Beitrag anzeigen
            Wenn wir das erstmal refaktorieren, wird es deutlich kürzer und deine Chancen steigen, dass es sich jemand durchliest.
            Danke nochmal. Aber sollte ich nicht "curl_close($ch);" nach "$result = trim(curl_exec($ch));" reinschreiben!? Und beim AIM-Check brauch ich halt zudem den Header in der Ausgabe.

            Also so?
            PHP-Code:
                if ($url == 'http://big.oscar.aol.com/'.$id.'?on_url=true&off_url=false')
                {
                
            curl_setopt($chCURLOPT_HEADER1);
                }
                else
                {
                
            curl_setopt($chCURLOPT_HEADER0);
                } 
            [e] Der 250ms-Timeout gilt für die jeweilige URL, nicht für die gesamte Funktion, oder!?

            [e2] Stimmt das jetzt so? Der Status wird nun jedenfalls korrekt angezeigt und die Profile recht fix aufgerufen.
            PHP-Code:
            function aimyim_status($id,$host) {
                if (
            $id === '') return;

                (...)

                
            $ch curl_init();
                
            curl_setopt($chCURLOPT_URL$url);
                
            curl_setopt($chCURLOPT_CONNECTTIMEOUT_MS100);
                
            curl_setopt($chCURLOPT_TIMEOUT_MS250);
                
            curl_setopt($chCURLOPT_DNS_CACHE_TIMEOUT5);
                
            curl_setopt($chCURLOPT_RETURNTRANSFER1);
                if (
            $url == 'http://big.oscar.aol.com/'.$id.'?on_url=true&off_url=false')
                {
                
            curl_setopt($chCURLOPT_HEADER1);
                }
                else
                {
                
            curl_setopt($chCURLOPT_HEADER0);
                }
                
            $result trim(curl_exec($ch));
                if (
            $result == '')
                {
                return 
            'unknown';
                }
                
            curl_close($ch);

                switch (
            $host) {
                    case 
            'yahoo':
                        
            $online intval($result) != 00; break;
                    case 
            'aim':
                        
            $online stripos($result'true'); break;
                    case 
            'icq':
                        
            $online stripos($result'online1'); break;
                    case 
            'msn':
                        
            $online stripos($result'online'); break;
                    case 
            'skype':
                        
            $online intval($result) != 1; break;
                }

                return 
            $online 'online' 'offline';

            Zuletzt geändert von baerenwurm; 25.02.2011, 18:25.

            Kommentar

            Lädt...
            X