AlexBausW: + (SERVER) langsamer Response von Domain auf gleichem Server

Hallo Alle :)

Ich habe mir ein kleines Programm geschrieben, welches mit folgender Subroutine Verbindung zu einem HTTP-Server aufnimmt sowie dort Daten anfordert, und desweiteren den Response filtert (in anderen Routinen :):

sub http_request {
        my ($request, $host, $port) = @_;

return unless scalar @_ == 3;

local $/;
        socket  SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp');
print "open socket: ", scalar localtime, "\n";
        connect SOCK, sockaddr_in($port, inet_aton($host));
print "connect socket: ", scalar localtime, "\n";
                send SOCK, $request, 0;
print "send request to host: ", scalar localtime, "\n";
                my $response = <SOCK>;
print "get response from host: ", scalar localtime, "\n";
        close   SOCK;
print "close socket: ", scalar localtime, "\n";
        return $response
}

Leider dauert die Serverantwort bzw. die Datenübertragung mit obiger Methode reproduzierbar ca. 17-18 sec. Rufe ich die angeforderte Datei direkt mit dem Browser auf, so habe ich sie schon nach ca. 3 sec auf meinem Bildschirm.

Die eingestreuten print-Anweisungen ergeben folgende Ausgabe:

open socket: Wed Jul 24 12:31:40 2002
connect socket: Wed Jul 24 12:31:40 2002
send request to host: Wed Jul 24 12:31:40 2002
get response from host: Wed Jul 24 12:31:57 2002
close socket: Wed Jul 24 12:31:57 2002

Im Access-log der angesprochenen Domain erscheint der entsprechende Eintrag zur selben Zeit, wie der Request durchgeführt wurde:

195.143.189.233 - - [24/Jul/2002:12:31:40 +0200] "GET /images/karte1.jpg HTTP/1.0" 200 15512 "http://www.genelogie-shop.de/?" "Mozilla/4.73 [de] (Win95; U)"

Beide Domains (die unter der das Skript liegt, und die unter der das Bild liegt) werden "auf" dem selben Server gehostet.
Entweder dauert die Auslieferung durch den Apachen so lange (wegen des Logfileeintrags aber imho unwahrscheinlich), oder die Datenübertragung ist zu langsam (was ich aber bei der "kurzen" Strecke nicht glauben will :), oder mein Perlskript liest die Daten nicht ordentlich vom Socket ein.

Kennt jemand dieses Problem, oder hat Vorschläge, wie ich die Ursache näher einkreisen kann? :)

Ich habe gerade nochmal das lesen vom Socket durch eine while-Schleife mit gleichzeitiger Ausgabe ersetzt:

while (<SOCK>) { print }

Siehe da, die Header-Daten und auch ein Teil des Inhalts ist "sofort" da. Dann wartet die Ausgabe, bis der Rest der Daten eintrudelt. Mit einem anderen Bild geht es genauso. Fordere ich Text bzw. HTML-Dateien an, gibt es diese Verzögerung nicht!? (*verwirrtbin*)
Hoffentlich hilft diese Beschreibung bei der Lösung des Problems. :)

Gruß Alex
--
http://www.google.de/search?hl=de&safe=off&q=Rechtschreibung+Standart

  1. Hallo,

    Ich habe mir ein kleines Programm geschrieben, welches mit
    folgender Subroutine Verbindung zu einem HTTP-Server aufnimmt
    sowie dort Daten anfordert, und desweiteren den Response filtert
    (in anderen Routinen :):

    perldoc LWP::UserAgent :)

    socket  SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp');

    perldoc IO::Socket (das ist in der Standard-Distribution)

    Ich habe gerade nochmal das lesen vom Socket durch eine
    while-Schleife mit gleichzeitiger Ausgabe ersetzt:

    while (<SOCK>) { print }

    Siehe da, die Header-Daten und auch ein Teil des Inhalts ist
    "sofort" da. Dann wartet die Ausgabe, bis der Rest der Daten
    eintrudelt. Mit einem anderen Bild geht es genauso. Fordere ich
    Text bzw. HTML-Dateien an, gibt es diese Verzögerung nicht!?
    (*verwirrtbin*)

    Du weisst aber schon, dass es in Binaer-Dateien keine Zeilen gibt?
    Will heissen, der <>-Operator muss dann komplett alles aus dem Socket
    lesen -- es gibt schliesslich nur eine einzige Zeile.

    IMHO solltest du read() bzw. sysread() benutzen und kleine (z. B.
    128 Byte) Bloecke lesen. Warum benutzt du eigentlich nicht
    LWP::UserAgent?

    Gruesse,
     CK

    1. Hallo Christian,

      [Skript das Daten über HTTP anfordert]

      perldoc LWP::UserAgent :)

      Auch eine Möglichkeit, aber bei mir imho Overhead, da ich alle Header aus einem Request an das Skript einfach nach Filterung/Manipultion as_is an die in PATH_INFO angegebene Resource weiterreichen will. Da tut es imho auch ein "send SOCKET $request". :)

      socket  SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp');

      perldoc IO::Socket (das ist in der Standard-Distribution)

      Auch eine Möglichkeit, wobei hier aber IO::Socket iirc nicht wesentlich mehr ist, als ein Objekt-Interface für die entsprechenden Core-Funktionen.

      [...]

      while (<SOCK>) { print }

      Siehe da, die Header-Daten und auch ein Teil des Inhalts ist
      "sofort" da. Dann wartet die Ausgabe, bis der Rest der Daten
      eintrudelt. Mit einem anderen Bild geht es genauso. Fordere ich
      Text bzw. HTML-Dateien an, gibt es diese Verzögerung nicht!?
      (*verwirrtbin*)

      Du weisst aber schon, dass es in Binaer-Dateien keine Zeilen gibt?
      Will heissen, der <>-Operator muss dann komplett alles aus dem Socket
      lesen -- es gibt schliesslich nur eine einzige Zeile.

      Hmmm, vielleicht verstehe ich Dich jetzt falsch, aber imho tue ich doch genau das. :) Mit "local $/" dürfte Perl auch im Binärstream vorkommende 0A bzw. 0D ignorieren, und den Datenstrom komplett in meine Variable schreiben ($response = <SOCK>;)!?

      IMHO solltest du read() bzw. sysread() benutzen und kleine (z. B.
      128 Byte) Bloecke lesen. Warum benutzt du eigentlich nicht
      LWP::UserAgent?

      Zu 1) Auch dies bringt keine Geschwindigkeitssteigerung:

      my $response = ''; my $buffer;
              while (read SOCK, $buffer, 128) {
                      $response .= $buffer;
              }

      Wiederum dauert die Übertragung eines Bildes auf dem selben Server ca 17 sec. während eine mehr als 3mal so große HTML-Datei praktisch sofort (<= 1 sec.) vollständig geladen ist.
            Bsp.:
            HTML: http://www.dynamic-web-development.de/cgi-bin/filterproxy/server.cgi/http://www.ahnenforschung.net/
            BILD: http://www.dynamic-web-development.de/cgi-bin/filterproxy/server.cgi/http://www.ahnenforschung.net/images/logo/logo.gif

      Zu 2) siehe oben. Einerseits glaube ich nicht, daß es dadurch schneller wird (es werden ja im Endeffekt imho doch die gleichen Corefunktionen verwendet, ich kann mich aber auch fliegen ähh irren ;)) und Andererseits möchte ich relativ einfach Request und Response (jeweils Header oder auch Content) filtern, ohne durch die vielfältigen Möglichkeiten von LWP::UserAgent abgelenkt zu werden. :)

      Gruß Alex
      --
      http://www.google.de/search?hl=de&safe=off&q=Rechtschreibung+Standart