Fritz: getimagesize extrem langsam

Hallo,

zuerst einmal hoffe ich, dass ich den richtigen Themenbereich gewählt habe?
Oder sollte es doch PHP sein?

Ich habe ein Problem, das nur auf manchen Servern auftritt, und ich finde keinen offensichtlichen Grund in der phpinfo:

getimagesize($file) funktioniert tadellos, solange eine lokale Datei aufgerufen wird.
beim Aufruf einer externen Datei per http://... läuft getimagesize() aber extrem langsam, u.U bis zum PHP timeout

Anm: allow_url_fopen ist on

Vielleicht kennt jemand dieses Phänomen, und kann mir einen Hinweis geben.

Gruß Fritz

--
ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
http://webdesign.weisshart.de/
  1. Hallo, Fritz!

    beim Aufruf einer externen Datei per http://... läuft getimagesize() aber extrem langsam, u.U bis zum PHP timeout

    klingt für mich erst mal nicht verwunderlich. schliesslich muss php warten, bis der entfernte server das bild vollständig ausgeliefert hat, möglicherweise (ich kenne die internen vorgänge nicht) sogar nochmal mit nachträglichem umkopieren des bildes aus dem temp-verzeichnis in ein arbeitsverzeichnis von php, bevor die funktion ausgeführt werden kann.

    freundl. Grüsse aus Berlin, Raik

    --
    Der IE ist wichtig. Man benötigt ihn, um sich einen Browser zu besorgen.
    Resizeable Textarea 0.1d # docked JS-Console 0.1.1
    1. Hallo,

      klingt für mich erst mal nicht verwunderlich. schliesslich muss php warten, bis ...

      nein, das hat damit nichts zu tun. Wir reden hier nicht über Millisekunden, sondern über Minuten!
      Und auf manchen Servern klappt das auch (ohne erkennbaren Zeitverzug)

      Gruß Fritz

      --
      ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
      http://webdesign.weisshart.de/
      1. Hi Fritz,

        nein, das hat damit nichts zu tun. Wir reden hier nicht über Millisekunden, sondern über Minuten!
        Und auf manchen Servern klappt das auch (ohne erkennbaren Zeitverzug)

        Dies kann diverse Gründe haben, welche man mit den von dir gegebenen Informationen nicht näher spezifizieren kann. Erst mal wäre es interessant zu wissen, auf wie viele Bilder du getimagesize() in deinem Script anwendest. Falls es sich um eine Art Bildergalerie handelt, dann werden es wohl ca. 50 Bilder sein. Geht man davon aus, dass jedes Bild 1 Sekunde zum Laden brauchst, so bist du mit 50 Sekunden Laufzeit schon deutlich über der Default-Maximallaufzeit von 30 Sekunden.

        Desweiteren gilt es zu bedenken, dass Server unterschiedliche Anbindungen haben. Darunter versteht man die Geschwindigkeit, mit der ein Server an das Internet angeschlossen ist (einfach ausgedrückt). Ein Server mit 1 GBit/s Anbindung lädt die Daten natürlich deutlich schneller, also ein Server mit einer Anbindung von 10 MBit/s. Natürlich gilt diese Beschränkung sowohl für den Server, der getimagesize() verwendet, wie auch für den Server der die Bilder liefert. Es bringt dir nichts, wenn dein eigener Server super schnell ist, aber der Server von dem du die Bilder abrufst total langsam ist.

        Letztendlich können es auch temporäre Probleme sein. Vielleicht ist dein Server grade mit anderen Arbeiten ausgelastet, vielleicht wird auf einem anderen Server, welcher sich im gleichen Rack mit deinem Server befindet, gerade ein Backup gefahren, sodass die Leitungen schon übermäßig ausgelastet sind. Kurz um, es gibt zig theoretische wie praktische Gründe, die dein langsames Script verursachen.

        Du solltest dir also angewöhnen, die Größen für die Bilder zwischenzuspeichern, sodass du nicht bei jedem Seitenaufruf die Größe herausfinden musst. Im Idealfall musst du getimagesize() für jedes Bild nur ein einziges Mal aufrufen, nämlich dann, wenn das Bild neu zu deiner "Sammlung" hinzugekommen ist. Alternativ, verzichte darauf, die Größe der Bilder auszulesen. Wenn du eh nur die Größe in den img-Tag schreiben willst, wäre das wohl die sinnvollste Lösung, da die Browser das Bild automatisch in seiner Originalgröße auf der Webseite darstellen.

        Viele Grüße,
          ~ Dennis.

        1. Hallo,

          Erst mal wäre es interessant zu wissen, auf wie viele Bilder du getimagesize() in deinem Script anwendest.

          1 (ein!)Bild (testcase, damit ich nicht durch 50 teilen muss)

          Gruß Fritz

          --
          ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
          http://webdesign.weisshart.de/
          1. Hallo,

            Ich denke, ich sollte hier mal einfach den komplette Source liefern - so wahnsinnig viel ist das ja nicht ;-)

            ------------------
            <?php

            $file = "http://......jpg";
            echo '<img src="'.$file.'">';

            $size = getimagesize (trim($file));
            echo $size[0];

            ?>

            Gruß Fritz

            --
            ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
            http://webdesign.weisshart.de/
            1. Hello,

              Hallo,

              Ich denke, ich sollte hier mal einfach den komplette Source liefern - so wahnsinnig viel ist das ja nicht ;-)


              <?php

              $file = "http://......jpg";
              echo '<img src="'.$file.'">';

              Hier wird das File nicht auf den Server geladen, sondern erst später vom Client.

              $size = getimagesize (trim($file));
              echo $size[0];

              ?>

              Du wirst nicht drum herum kommen, das File auf Deinen Server zu holen, wenn Du hineinschauen willst!
              Also nochmal die Einfachvariante

              $filecontents = file_get_contents($file);
                file_put_contents ('temp_file',$filecontents);

              $_img = getimagesize('temp_file');
                unlink('temp_file');
                echo $_img[0];

              Hast Du das denn wenigstens mal ausprobiert?
              Die Server untereinander werden doch wohl kaum, mit DSL1000 verbunden sein, sondern eher redundant mit 2x155MBit oder schneller, oder?

              Der wahlfreie Zugriff auf fremde Ressourcen über HTTP scheitert i.d.R. am Buffering!

              Harzliche Grüße vom Berg
              http://bergpost.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

              1. Hallo,

                Sorry Tom, ich hatte deine Antwort erst später gelesen.

                $filecontents = file_get_contents($file);

                Hast Du das denn wenigstens mal ausprobiert?

                Klar hab' ich, und ich sehe jetzt klarer.
                Der Server erlaubt keinen URL file access, ist aber so schlampig konfiguriert, dass er keine ordentliche Fehlermeldung ausgibt, sondern in ein timeout läuft.

                Also statt:
                Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /.../test2.php on line 7

                spukte er nur aus:
                Warning: file_get_contents(http://....jpg): failed to open stream: Connection timed out

                Um so etwas abzufangen, würde ich nun gerne prüfen, ob file_get_contents auf dem Server erlaubt ist.
                Wie kann ich das prüfen, ohne in obigen timeout zu laufen?

                if(file_get_contents) ...? _so_ nicht :-)

                Gruß Fritz

                --
                ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
                http://webdesign.weisshart.de/
                1. Hello,

                  schau doch erstmal in die php-Einstellungen mittels phpoinfo() hinein.
                  Ich denke, du kannst auch einen Link hier posten auf ein Script mit phpinfo(), solltest das Script dann später nur wieder entfernen oder mit Zugriffsschutz versehen. Denn wenn Du den Server nicht selbst konfigurieren darfst, dann kannst Du einige der potentiellen Sicherheitslücken zwar sehen, aber nichts dagegen tun.

                  Und wenn die "fopen-Wrapper" bei Dir verboten sind,
                  http://de.php.net/manual/en/configure.php#configure.disable-url-fopen-wrapper
                  http://de.php.net/manual/en/ref.filesystem.php
                  dann belibt Dir immer noch der Versuch über fsockopen()
                  http://de.php.net/manual/en/function.fsockopen.php
                  um die Datei (Ressourrce) über HTTP anzufordern.

                  Im PHP-Manual stehen Beispiele für die Datenübertragung.
                  Belasse es bei der Buffergröße auch bei 128 Byte. Größere Paketanforderungen könnten schon wieder Probleme ergeben. Eigentlich sollte man auch locker Pakete von 576 Bytes abzüglich einiger Overheads anfordern können... aber...  :-)

                  Du siehst dort auch, dass es zwei Timeouts gibt. Eines ist für die Installation der "Verbindung" und das andere für jeden Leseprozess.

                  Harzliche Grüße vom Berg
                  http://bergpost.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau
                  Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                2. Moin!

                  Klar hab' ich, und ich sehe jetzt klarer.
                  Der Server erlaubt keinen URL file access, ist aber so schlampig konfiguriert, dass er keine ordentliche Fehlermeldung ausgibt, sondern in ein timeout läuft.

                  Das denke ich nicht. Der File-Zugriff auf HTTP-Ressourcen ist durchaus erlaubt, aber dein Server kann offenbar - Gründe sind vielfältig, aber ohne Kenntnis von Interna nicht wirklich zu beantworten - keine funktionierende Verbindung zum Zielserver aufbauen.

                  Mögliches Szenario: Dein Provider erlaubt dir HTTP-Zugriffe nur auf deine eigene Domain oder nur auf ebenfalls bei ihm gehostete Präsenzen, verbietet aber den willkürlichen Zugriff auf das restliche Web. Mögliche Gründe sind, dass er dadurch verhindert, dass sich böse Menschen bei ihm einmieten und Spambots betreiben.

                  Das würde ich dann garantiert nicht unter "schlampig konfiguriert" summieren.

                  Um so etwas abzufangen, würde ich nun gerne prüfen, ob file_get_contents auf dem Server erlaubt ist.
                  Wie kann ich das prüfen, ohne in obigen timeout zu laufen?

                  Fein dosierte Analysemöglichkeiten erhälst du nur mit fsockopen().

                  - Sven Rautenberg

                  --
                  "Love your nation - respect the others."
                  1. Hallo Sven und Tom,

                    mal ein "Zwischendurchdanke" für euere Geduld.

                    Fein dosierte Analysemöglichkeiten erhälst du nur mit fsockopen().

                    Ich hab mal Folgendes probiert:
                    -----------------------------------
                    $source = "http://webdesign.weisshart.de/images/lichtrouten.jpg";
                    echo '<img src="'.$source.'">';
                    // das echo hier nur als Beleg, dass $source existiert

                    $fp = fsockopen($source, 80, $errno, $errstr, 30);
                    if (!$fp) {
                        echo "$errstr ($errno)<br />\n";
                    } else {
                        $out = "GET / HTTP/1.1\r\n";
                        $out .= "Host: www.example.com\r\n";
                        $out .= "Connection: Close\r\n\r\n";

                    fwrite($fp, $out);
                        while (!feof($fp)) {
                            echo fgets($fp, 128);
                        }
                        fclose($fp);
                    }
                    --------------------------

                    Resultat:
                    Warning: fsockopen(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/freehost-script/user_web/wdw/test2.php on line 9

                    Warning: fsockopen(): unable to connect to http://webdesign.weisshart.de/images/lichtrouten.jpg:80 in /var/www/freehost-script/user_web/wdw/test2.php on line 9
                    Success (0)

                    http://wdw.ja-nee.de/test2.php
                    http://wdw.ja-nee.de/phpinfo.php

                    Gruß Fritz

                    --
                    ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
                    http://webdesign.weisshart.de/
                    1. Moin!

                      Ich hab mal Folgendes probiert:

                      $source = "http://webdesign.weisshart.de/images/lichtrouten.jpg";
                      $fp = fsockopen($source, 80, $errno, $errstr, 30);
                      Resultat:
                      Warning: fsockopen(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/freehost-script/user_web/wdw/test2.php on line 9

                      Logisch, denn $source ist falsch. Dort darf niemals eine HTTP-URL angegeben werden, sondern - wie das Handbuch zweifelsfrei sagt - die Adresse (entweder IP oder DNS-Name) des Zielservers.

                      - Sven Rautenberg

                      --
                      "Love your nation - respect the others."
                      1. Hallo,

                        Tut mir leid, wenn mein angelesenes Wissen lückenhaft ist.

                        Logisch, denn $source ist falsch. Dort darf niemals eine HTTP-URL angegeben werden, sondern - wie das Handbuch zweifelsfrei sagt - die Adresse (entweder IP oder DNS-Name) des Zielservers.

                        Ich hab's geändert laut < http://de.php.net/manual/en/transports.php>
                        und damit exakt das Beispiel aus http://de.php.net/manual/en/function.fsockopen.php
                        auf den Server gestellt: http://wdw.ja-nee.de/test2.php
                        Ergebnis:
                        Warning: fsockopen(): unable to connect to www.example.com:80 in /var/www/freehost-script/user_web/wdw/test2.php on line 10
                        Connection timed out (110)

                        Gruß Fritz

                        --
                        ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
                        http://webdesign.weisshart.de/
                        1. Moin!

                          Ich hab's geändert laut http://de.php.net/manual/en/transports.php
                          und damit exakt das Beispiel aus http://de.php.net/manual/en/function.fsockopen.php
                          auf den Server gestellt: http://wdw.ja-nee.de/test2.php
                          Ergebnis:
                          Warning: fsockopen(): unable to connect to www.example.com:80 in /var/www/freehost-script/user_web/wdw/test2.php on line 10
                          Connection timed out (110)

                          Siehst du, genau wie ich vermutet habe: Dein Server mit dem Skript darf keine Verbindung zu einem externen Server auf Port 80 machen.

                          Also kannst du dich auf den Kopf stellen, du wirst auch mit den fopen-Wrappern keinen Erfolg haben.

                          - Sven Rautenberg

                          --
                          "Love your nation - respect the others."
                          1. Hallo,

                            Siehst du, genau wie ich vermutet habe: Dein Server mit dem Skript darf keine Verbindung zu einem externen Server auf Port 80 machen.

                            Also kannst du dich auf den Kopf stellen, du wirst auch mit den fopen-Wrappern keinen Erfolg haben.

                            Jetzt zwei Anschlussfragen:
                            1. Wie wird das auf dem Server eingestellt? In der PHP Konfiguration?

                            2. Gibt es eine Möglichkeit, dieses "Dein Server mit dem Skript darf keine Verbindung zu einem externen Server auf Port 80 machen" per PHP abzufragen, damit mein Script nicht in einen timeout läuft.

                            Gruß Fritz

                            --
                            ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
                            http://webdesign.weisshart.de/
                            1. Moin!

                              Siehst du, genau wie ich vermutet habe: Dein Server mit dem Skript darf keine Verbindung zu einem externen Server auf Port 80 machen.

                              Also kannst du dich auf den Kopf stellen, du wirst auch mit den fopen-Wrappern keinen Erfolg haben.

                              Jetzt zwei Anschlussfragen:

                              1. Wie wird das auf dem Server eingestellt? In der PHP Konfiguration?

                              Nein, diese Einstellung kommt von deinem Provider.

                              1. Gibt es eine Möglichkeit, dieses "Dein Server mit dem Skript darf keine Verbindung zu einem externen Server auf Port 80 machen" per PHP abzufragen, damit mein Script nicht in einen timeout läuft.

                              Du kannst dem fsockopen eine Timeout-Zeit mitteilen, und natürlich auch die auftretenden Fehler abfangen und dann entsprechend reagieren. Das sollte eigentlich ausreichen.

                              - Sven Rautenberg

                              --
                              "Love your nation - respect the others."
                              1. Hello,

                                Nein, diese Einstellung kommt von deinem Provider.

                                Das interessiert mich nun wieder:
                                Wie stellt der das denn ein?
                                Was ist an einem Zugriff über die Sockets anders, als an einem "normalen" PHP-Zugriff?

                                Ist es die Client-Funktionalität, die PHP sonst ja nicht bedienen muss, die bei funktionierenden Sockets "extra" ist?

                                Und noch eine Frage:
                                Mir ist entfallen, wie man an das Configure-Statement von PHP kommt.
                                Früher stand das immer im Kopf der php.ini
                                In den neueren Versionen, die ich in der letzten Zeit in die Finger bekommen habe, steht es überall nicht mehr drin.

                                Harzliche Grüße vom Berg
                                http://bergpost.annerschbarrich.de

                                Tom

                                --
                                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                Nur selber lernen macht schlau
                                Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                1. Moin!

                                  Nein, diese Einstellung kommt von deinem Provider.

                                  Das interessiert mich nun wieder:
                                  Wie stellt der das denn ein?
                                  Was ist an einem Zugriff über die Sockets anders, als an einem "normalen" PHP-Zugriff?

                                  Was ist denn ein "normaler PHP-Zugriff"?

                                  Ist es die Client-Funktionalität, die PHP sonst ja nicht bedienen muss, die bei funktionierenden Sockets "extra" ist?

                                  Es ist die Firewall, die den TCP-Zugriff blockiert. Und das ist bei allen Netzwerkvorgängen, die HTTP sprechen, gleich.

                                  - Sven Rautenberg

                                  --
                                  "Love your nation - respect the others."
                                  1. Hello,

                                    Was ist denn ein "normaler PHP-Zugriff"?

                                    Der den Host als Server benutzt, denke ich.
                                    Im von Fritz gewünschten Fall sendet der Host den Request, spielt also Client.

                                    Ist es die Client-Funktionalität, die PHP sonst ja nicht bedienen muss, die bei funktionierenden Sockets "extra" ist?

                                    Es ist die Firewall, die den TCP-Zugriff blockiert. Und das ist bei allen Netzwerkvorgängen, die HTTP sprechen, gleich.

                                    Aber doch nicht jeden? Sonst könnte man doch nicht auf den Server zugreifen.
                                    Also nicht immer, sondern nur dann, wenn er Client spielt?

                                    Harzliche Grüße vom Berg
                                    http://bergpost.annerschbarrich.de

                                    Tom

                                    --
                                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                    Nur selber lernen macht schlau
                                    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                    1. Moin!

                                      Was ist denn ein "normaler PHP-Zugriff"?

                                      Der den Host als Server benutzt, denke ich.

                                      Wieso "denke ich"? Du hast die zwei Begriffe doch eingeführt - da mußt du doch wissen, was du damit meinst.

                                      Es ist die Firewall, die den TCP-Zugriff blockiert. Und das ist bei allen Netzwerkvorgängen, die HTTP sprechen, gleich.

                                      Aber doch nicht jeden? Sonst könnte man doch nicht auf den Server zugreifen.
                                      Also nicht immer, sondern nur dann, wenn er Client spielt?

                                      Wie jede Firewall gibts natürlich auch hier Regeln, die man konfigurieren kann, um ausgehenden Traffic auf fremde Port 80 zu verhindern, und eingehenden Traffic auf den internen Port 80 zu erlauben.

                                      - Sven Rautenberg

                                      --
                                      "Love your nation - respect the others."
                              2. Hallo,

                                1. Gibt es eine Möglichkeit, dieses "Dein Server mit dem Skript darf keine Verbindung zu einem externen Server auf Port 80 machen" per PHP abzufragen, damit mein Script nicht in einen timeout läuft.

                                Du kannst dem fsockopen eine Timeout-Zeit mitteilen, und natürlich auch die auftretenden Fehler abfangen und dann entsprechend reagieren. Das sollte eigentlich ausreichen.

                                Auf die Gefahr hin, dass ich langsam lästig falle:
                                Ich habe das Beispiel 2158 von http://de.php.net/manual/de/function.stream-set-timeout.php

                                auf http://wdw.ja-nee.de/test4.php

                                online gestellt:

                                Warning: fsockopen(): unable to connect to www.example.com:80 in /var/www/freehost-script/user_web/wdw/test4.php on line 2
                                Unable to open

                                Und diese Meldung eben auch erst nach 1 Minute, also auch nicht gerade ideal, um innerhalb eines Scripts als Abfrage verwendet zu werden?

                                Gruß Fritz

                                --
                                ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
                                http://webdesign.weisshart.de/
                                1. Moin!

                                  Auf die Gefahr hin, dass ich langsam lästig falle:
                                  Ich habe das Beispiel 2158 von http://de.php.net/manual/de/function.stream-set-timeout.php

                                  Das setzt den Timeout, wenn die Verbindung schon eröffnet ist.

                                  Ich spielte eigentlich vielmehr auf den Timeout-Parameter im fsockopen an.

                                  Und diese Meldung eben auch erst nach 1 Minute, also auch nicht gerade ideal, um innerhalb eines Scripts als Abfrage verwendet zu werden?

                                  Ohne Verbindung kein Timeout im aktiven Stream.

                                  - Sven Rautenberg

                                  --
                                  "Love your nation - respect the others."
                                2. Hello,

                                  Auf die Gefahr hin, dass ich langsam lästig falle:
                                  Ich habe das Beispiel 2158 von http://de.php.net/manual/de/function.stream-set-timeout.php

                                  auf http://wdw.ja-nee.de/test4.php

                                  online gestellt:

                                  Warning: fsockopen(): unable to connect to www.example.com:80 in /var/www/freehost-script/user_web/wdw/test4.php on line 2
                                  Unable to open

                                  Und diese Meldung eben auch erst nach 1 Minute, also auch nicht gerade ideal, um innerhalb eines Scripts als Abfrage verwendet zu werden?

                                  Warum übernimmstr Du es denn 1:1?
                                  Du hättest das Timeout doch auf 5 Sekunden verändern können.
                                  Meistens reichen 1,5 Sekunden schon, wenn man nicht gerade über Wählleitung und Modem hantieren muss.

                                  <?php
                                  $fp = fsockopen("www.example.com", 80, $errno, $errmsg, 5);    ## kleine Ergänzung, große Wirkung!
                                  if (!$fp) {

                                  ...

                                  Ich hatte schon einmal darauf hingewissen in diesem Thread, dass es zwei unterschiedliche Timeouts gibt. Eines für die Beschaffung des Sockets und eines für die Übertragung des jeweils angeforderten Datenblockes.

                                  Harzliche Grüße vom Berg
                                  http://bergpost.annerschbarrich.de

                                  Tom

                                  --
                                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                  Nur selber lernen macht schlau
                                  Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                  1. Hallo,

                                    $fp = fsockopen("www.example.com", 80, $errno, $errmsg, 5);
                                    if (!$fp) {

                                    ...

                                    _Das_ habe ich gesucht. Vielen Dank, auch an Sven.

                                    Ich hatte schon einmal darauf hingewissen in diesem Thread, dass es zwei unterschiedliche Timeouts gibt. Eines für die Beschaffung des Sockets und eines für die Übertragung des jeweils angeforderten Datenblockes.

                                    Asche über mein Haupt - ich hatte das zwar gelesen, aber die Konsequenz nicht verinnerlicht.

                                    Gruß Fritz

                                    --
                                    ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
                                    http://webdesign.weisshart.de/
                                    1. Hello,

                                      $fp = fsockopen("www.example.com", 80, $errno, $errmsg, 5);
                                      if (!$fp) {

                                      ...

                                      _Das_ habe ich gesucht. Vielen Dank, auch an Sven.

                                      Es ändert nur nichts an dem Problem, dass Dein Provider vermutlich per Firewall-Regel Initial-Requests auf  Port 80 anderer Server verboten hat.

                                      Du könntest mal, nur so zum Spaß, einen solchen Request auf den Server selber ausführenn, also auf ein Bild, das Du eigentlich auf anderem Wege auch über das lokale Filesystem ereichen könntest.

                                      Da kannst Du mit der Domain nur umziehen zu einen Provider, der das zulässt.
                                      VHosts mit (fast) allen Rechten gibt es schon für 8 Euro im Monat.

                                      Harzliche Grüße vom Berg
                                      http://bergpost.annerschbarrich.de

                                      Tom

                                      --
                                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                      Nur selber lernen macht schlau
                                      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                          2. Hello Sven,

                            Warning: fsockopen(): unable to connect to www.example.com:80 in /var/www/freehost-script/user_web/wdw/test2.php on line 10
                            Connection timed out (110)

                            Siehst du, genau wie ich vermutet habe: Dein Server mit dem Skript darf keine Verbindung zu einem externen Server auf Port 80 machen.

                            Ist es nicht einfach die falsche Domain, die Fritz abfragt?

                            Das Protokoll gehört nicht in den Hostnamen und außerdem ist "www.example.org" wohl auch nicht seine Domain, oder?

                            Harzliche Grüße vom Berg
                            http://bergpost.annerschbarrich.de

                            Tom

                            --
                            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                            Nur selber lernen macht schlau
                            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                            1. Hello,

                              so, nun noch mal eine funktionstüchtige Variante.
                              Die ist fraglos auch nur experiemntell, denn die in der Response enthaltenen Header sollten tunlichst ausgewertet werden. Ich schneide sie hier nur ab.

                              <?php   ### fsockoben.php ###

                              #-----------------------------------
                              $domain= "webdesign.weisshart.de";
                              $resource = "/images/lichtrouten.jpg";

                              $fp = fsockopen($domain, 80, $errno, $errstr, 10);    ## 10 Sekunden müssn reichen
                              if (!$fp) {
                                  echo "$errstr ($errno)<br />\n";
                              } else {
                                  $out = "GET $resource HTTP/1.1\r\n";
                                  $out .= "Host: $domain\r\n";
                                  $out .= "Connection: Close\r\n\r\n";

                              fwrite($fp, $out);

                              $response = '';

                              while (!feof($fp))
                                  {
                                    $response .= fgets($fp, 128);
                                  }
                                  fclose($fp);
                              }
                              #--------------------------

                              // das echo hier nur als Beleg, dass $source existiert
                              if (isset($_GET['do']) and $_GET['do'] == 'direkt')
                              {
                                echo "<img src="http://$domain$resource">";
                                echo "<p>Bildgroesse: ".strlen($bild)."</p>\n";
                              }

                              oder ausgeben mit

                              $_splitresponse = explode("\r\n\r\n",$response,2);

                              if (! headers_sent())
                              {
                                header('Content-type: image/jpeg');
                                echo $_splitresponse[1];
                              }
                              #--------------------------

                              ?>

                              Harzliche Grüße vom Berg
                              http://bergpost.annerschbarrich.de

                              Tom

                              --
                              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                              Nur selber lernen macht schlau
                              Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                              1. Hello,

                                meine letzte Version für heute, damit man die Header auch sehen kann...

                                <?php   ### fsockoben.php ###

                                #-----------------------------------
                                $domain= "webdesign.weisshart.de";
                                $resource = "/images/lichtrouten.jpg";

                                $fp = fsockopen($domain, 80, $errno, $errstr, 15);
                                if (!$fp) {
                                    echo "$errstr ($errno)<br />\n";
                                } else {
                                    $out = "GET $resource HTTP/1.1\r\n";
                                    $out .= "Host: $domain\r\n";
                                    $out .= "Connection: Close\r\n\r\n";

                                fwrite($fp, $out);

                                $response = '';

                                while (!feof($fp))
                                    {
                                      $response .= fgets($fp, 128);
                                    }
                                    fclose($fp);
                                }
                                #--------------------------

                                $_splitresponse = explode("\r\n\r\n",$response,2);

                                // das echo hier nur als Beleg, dass $source existiert
                                if (isset($_GET['do']) and $_GET['do'] == 'direkt')
                                {
                                  echo "<img src="http://$domain$resource">";
                                  echo "<p>Header: {$_splitresponse[0]} </p>\n
                                        <p>Bildgroesse: ".strlen($_splitresponse[1])."</p>\n";
                                }
                                else # oder ausgeben mit header
                                {
                                  if (! headers_sent())
                                  {
                                    header('Content-type: image/jpeg');
                                    echo $_splitresponse[1];
                                  }
                                  else
                                  {
                                    echo "<p>Bätsch!</p>\n";
                                  }
                                }

                                #--------------------------

                                ?>

                                ... und es der ursprünglichen Aufgabenstellung so nahe wie möglich kommt.

                                Harzliche Grüße vom Berg
                                http://bergpost.annerschbarrich.de

                                Tom

                                --
                                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                Nur selber lernen macht schlau
                                Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                1. Hello,

                                  Hello,

                                  meine letzte Version für heute, damit man die Header auch sehen kann...

                                  <?php   ### fsockopen.php ###

                                  #-----------------------------------
                                  $domain= "webdesign.weisshart.de";
                                  $resource = "/images/lichtrouten.jpg";

                                  $fp = fsockopen($domain, 80, $errno, $errstr, 15);
                                  if (!$fp) {
                                      echo "$errstr ($errno)<br />\n";
                                  } else {
                                      $out = "GET $resource HTTP/1.1\r\n";
                                      $out .= "Host: $domain\r\n";
                                      $out .= "Connection: Close\r\n\r\n";

                                  fwrite($fp, $out);

                                  $response = '';

                                  while (!feof($fp))
                                      {
                                        $response .= fgets($fp, 128);
                                      }
                                      fclose($fp);
                                  }
                                  #--------------------------

                                  $_splitresponse = explode("\r\n\r\n",$response,2);

                                  // das echo hier nur als Beleg, dass $source existiert
                                  if (isset($_GET['do']) and $_GET['do'] == 'direkt')
                                  {
                                    echo "<img src="http://$domain$resource">";
                                    echo "<p>Header: {$_splitresponse[0]} </p>\n
                                          <p>Bildgroesse: ".strlen($_splitresponse[1])."</p>\n";
                                  }
                                  else # oder ausgeben mit header
                                  {
                                    if (! headers_sent())
                                    {
                                      header('Content-type: image/jpeg');
                                      echo $_splitresponse[1];
                                    }
                                    else
                                    {
                                      echo "<p>Bätsch!</p>\n";
                                    }
                                  }

                                  #--------------------------

                                  ?>

                                  ... und es der ursprünglichen Aufgabenstellung so nahe wie möglich kommt.

                                  Harzliche Grüße vom Berg
                                  http://bergpost.annerschbarrich.de

                                  Tom

                                  Harzliche Grüße vom Berg
                                  http://bergpost.annerschbarrich.de

                                  Tom

                                  --
                                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                  Nur selber lernen macht schlau
                                  Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                  1. Hallo,

                                    meine letzte Version für heute, damit man die Header auch sehen kann...

                                    Hm, ein lauffähiges Script im SelfHTML Forum :-)
                                    Danke vielmals, womit hab' ich das verdient?

                                    Die ursprüngliche Aufgabenstellung sinngemäß: warum erzeugt getimagesize einen timeout?
                                    Nachdem Sven recht deutlich die Ursache genannt hat: "Dein Server unterstützt das nicht"
                                    habe ich die Aufgabenstellung erweitert:
                                    Wie kann ich eine Abfrage formulieren, die diesen timeout verhindert, wenn "der Server das nicht unterstützt"

                                    Deine "letzte Version für heute" brachte mich leider auch nicht viel weiter:
                                    http://wdw.ja-nee.de/test3.php

                                    Gruß Fritz

                                    --
                                    ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
                                    http://webdesign.weisshart.de/
                                    1. Hello,

                                      Deine "letzte Version für heute" brachte mich leider auch nicht viel weiter:
                                      http://wdw.ja-nee.de/test3.php

                                      Schade.

                                      http://de.php.net/manual/de/ref.sockets.php

                                      Da kannst Du jetzt nur nochmal nach dem Bremser gucken.
                                      Entweder, Dein PHP ist nicht mit sockets kompiliert, aber dann wären mWn auch die Funktionen nicht vorhanden, oder aber der Provider hat doch eine Firewall entsprechend eingerichtet.

                                      Was sagt denn Dein phpinfo() über die "verbotenen Funktionen"?
                                      Ich erinnere mich daran, dass die einfach nur gar nichts machen, wenn sie in der Liste von

                                      disable_functions

                                      stehen. Und das wäre ja so ungefähr das, was Du bekommst.
                                      Wenn die Funktion nicht vorhanden wäre, würdest Du einen anderen Fehler bekommen.

                                      Läuft PHP bei Dir als Modul oder als CGI?
                                      Welche Version hast Du drauf?

                                      Harzliche Grüße vom Berg
                                      http://bergpost.annerschbarrich.de

                                      Tom

                                      --
                                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                      Nur selber lernen macht schlau
                                      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                      1. Hello,

                                        Ok, hier muss ich mich korrigieren:

                                        Was sagt denn Dein phpinfo() über die "verbotenen Funktionen"?
                                        Ich erinnere mich daran, dass die einfach nur gar nichts machen, wenn sie in der Liste von

                                        disable_functions

                                        stehen. Und das wäre ja so ungefähr das, was Du bekommst.
                                        Wenn die Funktion nicht vorhanden wäre, würdest Du einen anderen Fehler bekommen.

                                        Es gibt, zumindest bei PHP 5.2.0 (von Debian etch) eine Fehlermeldung dann:
                                        functionsname() has beeb disabled by safety reasons   ... oder zumindest so ählich.

                                        Harzliche Grüße vom Berg
                                        http://bergpost.annerschbarrich.de

                                        Tom

                                        --
                                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                        Nur selber lernen macht schlau
                                        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                      2. Hallo,

                                        Was sagt denn Dein phpinfo() über die "verbotenen Funktionen"?

                                        disable_functions exec, passthru, system, popen, proc_open, shell_exec, escapeshellcmd, escapeshellarg

                                        sollte "popen" der Sünder sein?

                                        Welche Version hast Du drauf?

                                        4.4.2
                                        http://wdw.ja-nee.de/chat/phpinfo.php

                                        Gruß Fritz

                                        --
                                        ie:( fl:( br:? va:) ls:< fo:| rl:? ss:{ de:> js:| mo:} zu:}
                                        http://webdesign.weisshart.de/
                                        1. Hello,

                                          Was sagt denn Dein phpinfo() über die "verbotenen Funktionen"?

                                          disable_functions exec, passthru, system, popen, proc_open, shell_exec, escapeshellcmd, escapeshellarg

                                          sollte "popen" der Sünder sein?

                                          Nein. Das ist eine Prozess-Pointer auf lokale Prozesse.

                                          Der Safe-Mode ist bei Dir aber auch eingeschaltet, zusätzlich zu den expliziten Verboten von Funktionen.
                                          Dann kann ich mir nur vorstellen, dass der Provider in seiner Firewall eine Regel aufgestellt hat, die entsprechende Pakete in Ausgangsrichtung einfach unter den Tisch fallen lässt (Drop). Denn wenn sie abgelehnt würden (Reject), müsste fsockopen() die passende Fehlermeldung geben können.

                                          So habe ich das zumindest in Erinnerung.

                                          Vielleicht erklärt uns Sven dazu noch was?

                                          Harzliche Grüße vom Berg
                                          http://bergpost.annerschbarrich.de

                                          Tom

                                          --
                                          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                          Nur selber lernen macht schlau
                                          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                        2. Hello,

                          Warning: fsockopen(): unable to connect to www.example.com:80 in /var/www/freehost-script/user_web/wdw/test2.php on line 10
                          Connection timed out (110)

                          Dein gewünschtes Bild liegt doch gar nicht auf www.example.com!

                          Außerdam warst Du schon zîemlich dicht dran.

                          <?php   ### fsockoben.php ###

                          #-----------------------------------
                          $domain= "webdesign.weisshart.de";
                          $resource = "/images/lichtrouten.jpg";

                          $fp = fsockopen($domain, 80, $errno, $errstr, 15);
                          if (!$fp) {
                              echo "$errstr ($errno)<br />\n";
                          } else {
                              $out = "GET $resource HTTP/1.1\r\n";
                              $out .= "Host: $domain\r\n";
                              $out .= "Connection: Close\r\n\r\n";

                          fwrite($fp, $out);

                          $bild = '';

                          while (!feof($fp))
                              {
                                $bild .= fgets($fp, 128);
                              }
                              fclose($fp);
                          }
                          #--------------------------

                          // das echo hier nur als Beleg, dass $source existiert
                          if (isset($_GET['do']) and $_GET['do'] == 'direkt')
                          {
                            echo "<img src="http://$domain$resource">";
                            echo "<p>Bildgroesse: ".strlen($bild)."</p>\n";
                          }

                          oder ausgeben mit

                          if (! headers_sent())
                          {
                            #header('Content-type: image/jpeg');    ### hier passt noch 'was nicht
                            echo $bild;
                          }

                          #--------------------------

                          ?>

                          Ohne den Content-Type-Header wird trotzdem einer ausgegeben.
                          Da habe ich nun auch noch einen Denkknoten.

                          Harzliche Grüße vom Berg
                          http://bergpost.annerschbarrich.de

                          Tom

                          --
                          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                          Nur selber lernen macht schlau
                          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                    2. Hallo Fritz,

                      $out = "GET / HTTP/1.1\r\n";

                      Nur mal so als allgemeine Ergänzung, auch wenn das an Deinem Problem nichts ändert (aber vielleicht ist's für andere hilfreich):

                      Du willst kein HTTP/1.1, sondern Du willst HTTP/1.0 und trotzdem einen Host-Header senden (auch wenn der in der 1.0 strenggenommen noch nicht drin ist). Warum? Clients, die HTTP/1.1-Anfragen stellen, MÜSSEN chunked encoding verstehen - das wird laut HTTP-Spec so vorgeschrieben. Selbst bei Connection: Close kann es vorkommen, dass die Server Daten chunked-kodiert senden, warum auch nicht, laut HTTP-Spec muss das der Client ja sowieso kapieren. Nachdem chunked zwar nicht überaus kompliziert ist, aber auch nicht vollkommen trivial zu implementieren, würde ich vorschlagen, als einfachere Methode einfach HTTP/1.0 + Host-Header zu verwenden, d.h. einen Request wie

                      GET / HTTP/1.0
                      Host: ...
                      sonstige header

                      abzusetzen - der Connection-Header sollte dann aber weggelassen werden, da HTTP/1.0 den ja nicht kennt und sowieso immer die Verbindung geschlossen wird.

                      Viele Grüße,
                      Christian

  2. Hello,

    zuerst einmal hoffe ich, dass ich den richtigen Themenbereich gewählt habe?
    Oder sollte es doch PHP sein?

    Ich habe ein Problem, das nur auf manchen Servern auftritt, und ich finde keinen offensichtlichen Grund in der phpinfo:

    getimagesize($file) funktioniert tadellos, solange eine lokale Datei aufgerufen wird.
    beim Aufruf einer externen Datei per http://... läuft getimagesize() aber extrem langsam, u.U bis zum PHP timeout

    Anm: allow_url_fopen ist on

    Wenn Du schon über HTTP zugreifen musst, dann mache es so:

    $filecontents = filt_get_contents('http:// ...);
      fileput_contents ('temp_file',$filecontents);

    $_img = getimagesize('temp_file');
      unlink('temp_file');

    das nur so als grobe Richtung.
    Natürlich muss auch beim datenverkehr mit dem fernen Server geschaut werden, ob das File unbeschädigt angekommen ist, also ggf. ein gelockter Zugriff durchgeführt werden und auf dem lolane Host musst Du natürlich darauf achten, dass temp_file nicht schon vorhanden ist...

    getimagesize() muss in dem geöffneten File _wahlfreien_Zugriff_ haben, also den Satzzeiger hin und her bewegen können. Das geht über den HTTP-Zugriff nicht. Da muss also immer gepuffert werden.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)