Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Langsame Socket-Kommunikation via PHP

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Langsame Socket-Kommunikation via PHP

    Hallo zusammen,

    bei Tests des Release 1.7-RC2 des Adventure PHP Frameworks habe ich festgestellt, dass das Laden von XML-Inhalten via Socket erheblich länger dauert, als ein Aufruf der Ressource via Browser. Auf meiner lokalen Entwicklungsumgebung (WinXPSP3,Apache2.0.x,PHP5.2.x) führt die Abfrage zum Timeout (PHP max_execution_time), auf meiner LINUX-Testmaschine (Fedora 9,Apache2.0.x,PHP5.2.x) wird die Seite nach 160s angezeigt.

    Zum konkreten Code, der IMHO das Problem darstellt. In einem DocumentController lese ich per

    PHP-Code:
    $Socket fsockopen($Host,80,$errno,$errstr,10);

    $Query 'GET '.$Query.' HTTP/1.0'.PHP_EOL;
    $Query .= 'User-Agent: APF weather module'.PHP_EOL;
    $Query .= 'Accept: */*'.PHP_EOL;
    $Query .= 'Host: '.$Host.PHP_EOL;
    $Query .= 'Connection: Keep-Alive'.PHP_EOL.PHP_EOL;
    fwrite($Socket,$Query);

    $Response = (string)'';
    while(!
    feof($Socket)){
       
    $Response .= fgets($Socket128);
    }

    fclose($Socket); 
    die Inhalte von einer Socket-Verbindung. Als Ergebnis erwarte ich ein XML, das mir die aktuellen Wetter-Meldungen anzeigt. Quelle in den Tests ist Wetter News von wetter.com. Die Variablen enthalten folgende Inhalte (zum Nachvollziehen):
    • $Host: feeds.feedburner.com
    • $Query: /wettercom/rss

    Rufe ich die URL per Browser auf, so wird das XML innerhalb von 200ms ausgeliefert, mit der oben genannten Methode benötige ich dafür 160s. Hat irgendjemand eine Idee, warum ein so krasser Zeitunterschied zwischen Aufruf im Browser und per Socket-Kommunikation besteht?

  • #2
    Hallo dr.e,

    Ich habe das ganze jetzt auch mal ausprobiert bei meiner Kiste (XP SP2) und es führt mit obigen Code auch zu einem Timeout.

    Ändere ich jedoch die Zeile:
    PHP-Code:
    $Query .= 'Connection: Keep-Alive'.PHP_EOL.PHP_EOL
    in
    PHP-Code:
    $Query .= 'Connection: close' PHP_EOL.PHP_EOL
    Dauert der Zugriff nur 0.446943044662 Sekunden und ich erhalte eine XML mit Allen Header Informationen

    Vielleicht hilft dir das ja weiter...

    Kommentar


    • #3
      Das wird am Keep-Alive liegen.
      Du musst das Transfer-Encoding (Thema Chunk-Encoding) beachten und dann die jeweils angebene Menge Daten abholen.

      Was passiert, wenn Du das Dokument testhalber per url wrapper lädst?
      PHP-Code:
      $fp fopen('http://....'$rb);
      // $meta = stream_get_meta_data($fp);
      $content stream_get_contents($fp); 
      ZUsätzliche Header kannst Du übrigens auch über die stream-api setzen und dann file_get_contents o.ä. verwenden.

      edit: zu langsam.
      Aber auch wenn man Connection:close angibt, gibt es (gab es zumindest) Webserver, die das Socket nicht geschlossen haben.

      Kommentar


      • #4
        Hallo ihr beiden,

        danke für den Hinweis mit Connection: close. Das hatte ich zu Anfangs auch, nur hat mir der Server dann ein leeres Dokument geschickt. Nun scheint mein Gegenüber jedoch wohlgesonnen zu sein und die Methode liefert brav das XML zurück.

        Die Methode über fopen-Wrappers wollte ich deshalb nicht einsetzen, da diese auf diversen Server deaktiviert sind. Falls das so ist, bleibt einzig die Möglichkeit direkte Socket-Verbindungen zu verwenden. Ein einfaches

        PHP-Code:
        return file_get_contents('feeds.feedburner.com/wettercom/rss'); 
        funktioniert aber natürlich auch.

        Kommentar

        Lädt...
        X