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

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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';

    Last edited by 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]

    Comment


    • #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';

      Last edited by onemorenerd; 25-02-2011, 14:37.

      Comment


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

        Comment


        • #5
          Originally posted by AmicaNoctis View Post
          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?

          Originally posted by h3ll View Post
          Wow, der Code wurde wohl mit einer Guttenberg-Tastatur geschrieben.
          Haha, in der Tat (halb).

          Originally posted by onemorenerd View Post
          Wenn wir das erstmal refaktorieren, wird es deutlich kürzer und deine Chancen steigen, dass es sich jemand durchliest.
          Danke!

          Comment


          • #6
            Originally posted by onemorenerd View Post
            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';

            Last edited by baerenwurm; 25-02-2011, 18:25.

            Comment

            Working...
            X