Rolf: auf was wartet PHP ...

Hallo,

auf Wunsch habe ich im Intranet PHP von Version 5.1. auf 5.2. aktualisiert.
Zur Navigation werden hier oft nachfolgende Konstrukte verwendet:

<?php  
header('Location: http://new.gint.edc/ztst/');  
exit;  
?>

Unter PHP/5.1. erfolgte die Weiterleitung verzögerungsfrei.
Unter PHP 5.2. verstreichen erst ca. 5-6 Sekunden und dann passiert etwas.
Fragen:
Worauf kann man diese Verzögerung zurückführen?
Wie lässt sich der Bug beheben?

Alle PC's haben WinXP und eine HOSTS-Datei um lokale Domains aufzulösen.

m.b.G. Rolf

  1. Worauf kann man diese Verzögerung zurückführen?
    Wie lässt sich der Bug beheben?

    <?php  
    header('Location: http://new.gint.edc/ztst/');  
    echo ' ';  
    exit;  
    ?>
    

    Versuch mal vor dem exit; ein echo reinpacken (wichtig ist, dass es irgendwas "ausgibt").

    Hört sich zwar jetzt komisch an, hat aber bei mir funktioniert. Nach Umstieg von PHP 4.4 auf PHP 5.2: plötzlich gingen sämtliche redirects nicht mehr ordentlich. Einige haben überhaupt nicht reagiert (es wurde einfach 200 OK ausgeliefert) und andere haben enorm zeitverzögert weitergeleitet. Um zu prüfen, ob ich mich selbst verarsche (vonwegen richtiges Script, richtiger Server), hab' ich die Weiterleitung durch echo 'hello world'; ersetzt und nach erfolgreicher Prüfung (ich war im richtigen Script) hab' ich den Redirect wieder eingebaut (ohne das echo zu entfernen). Danach hats einwandfrei funktioniert, kaum war das echo entfernt, hats wieder nicht mehr funktioniert - lediglich ein 200 OK mit dem "üblichen Inhalt der nach dem exit; im Dokument stand oder eben eine "zeitverzögerte" Umleitung.

    1. Hi,

      Hört sich zwar jetzt komisch an, ...

      Hätte da auch noch was anzubieten, auch ohne Begründung:

      header('Location: http://new.gint.edc/ztst/');die('xxx');

      Hans

    2. Hallo Suit,

      Versuch mal vor dem exit; ein echo reinpacken (wichtig ist, dass es irgendwas "ausgibt").

      okay,

      <?php  
      header('Location: http://new.gint.edc/ztst/');  
      echo '*';  
      exit;  
      ?>
      

      Bringt gar nix, ausser dass nach 6 Secunden das Sternchen zu sehen ist,
      wenn man die header()-Funktion auskommentiert ... :-(

      Werde jetzt auf 5.2.8 upgraden und melde mich dann wieder ...

      m.b.G. Rolf

      1. Hallo Suit,

        das Update hat geklappt und dies steht im access.log des Apache:
        192.168.2.20 - - [11/Feb/2009:11:25:34 +0100] "GET /go.gint.new.php HTTP/1.1" 302 -
        192.168.2.20 - - [11/Feb/2009:11:25:39 +0100] "GET /conf/npf/ HTTP/1.1" 200 7809

        Es dauert also exakt 5 Sekunden vom Aufruf des link-Scriptes bis zum Aufruf der Zielseite.
        IMHO kann das nur an PHP liegen, was anderes hat sich ja nicht verändert.
        Sorry - das verstehe ich nun wirklich nicht mehr ... :-((

        m.b.G. Rolf

        1. Hi,

          Sorry - das verstehe ich nun wirklich nicht mehr ... :-((

          hast du auch schon einen Test gemacht mit anderen (bekannten)URLs zb. Google usw...?

          Hans

          1. Hallo Hans,

            »» Sorry - das verstehe ich nun wirklich nicht mehr ... :-((
            hast du auch schon einen Test gemacht mit anderen (bekannten)URLs zb. Google usw...?

            natürlich,
            da tritt eine solche Totzeit nicht auf.

            Normalerweise würde ich daraus schliessen, dass PHP die lokale HOSTS nicht priorisiert, wie das üblich ist, sondern erst in der HOSTS nachschaut, wenn es die Domain auf dem verwendeten Nameserver nicht findet. Offensichtlich wird auch der DNS-Cache nicht verwendet, weil die 5 Sekunden bei jedem Aufruf der header()-Funktion mit einer lokalen URL auftreten. Normalwerweise sollten nachfolgende Aufrufe der gleichen URL deutlich fixer ablaufen, was sie jedoch nicht tun. Das ist sowieso alles sehr mysteriös. So wie es ausschaut, wird der DNS-Lookup des Systems komplett ignoriert.

            m.b.G. Rolf

            1. Hi,

              Normalerweise würde ich daraus schliessen, dass PHP die lokale HOSTS nicht priorisiert, wie das üblich ist, sondern erst in der HOSTS nachschaut, wenn es die Domain auf dem verwendeten Nameserver nicht findet. Offensichtlich wird auch der DNS-Cache nicht verwendet, weil die 5 Sekunden bei jedem Aufruf der header()-Funktion mit einer lokalen URL auftreten.

              Normalerweise wuerde ich daraus schliessen, dass dir nicht klar ist, was du eigentlich tust bzw. was dabei vorgeht.

              PHP interessiert sich fuer das DNS einen feuchten Kehrricht.
              Der Location-Header ist eine Ansage an den Client, sich die Daten doch bitteschoen von einer anderen Adresse zu besorgen.
              Wenn also jemand diese Adresse zwecks Aufloesung ans DNS zu uebergeben hat, dann der Client.

              MfG ChrisB

              --
              „This is the author's opinion, not necessarily that of Starbucks.“
              1. Hallo Chris,

                PHP interessiert sich fuer das DNS einen feuchten Kehrricht.

                okay,
                was ist es dann ... ?

                Der Location-Header ist eine Ansage an den Client, sich die
                Daten doch bitteschoen von einer anderen Adresse zu besorgen.
                Wenn also jemand diese Adresse zwecks Aufloesung ans DNS zu
                uebergeben hat, dann der Client.

                hmm,
                die Browser wurden nicht verändert, _nur_ PHP von 5.2.5 auf 5.2.8.
                Aber wie _und_ warum hält PHP die Meldung an den Browser zurück?

                m.b.G. Rolf

                1. 你好 Rolf,

                  Aber wie _und_ warum hält PHP die Meldung an den Browser zurück?

                  Debugge doch mal mit z. B. curl -I. Da kannst du doch viel besser feststellen, was eigentlich passiert.

                  再见,
                   克里斯蒂安

                  --
                  http://wwwtech.de/
                  IRC-Clients und Irssi-Scripting | Flyspray
                  <g[oma]> peter lustig ist auf jeden fall besser als peter huth, obwohl der auch lustig ist.
                  1. Debugge doch mal mit z. B. curl -I. Da kannst du doch viel besser feststellen, was eigentlich passiert.

                    hmm,
                    gibt es das auch in deutsch und für Windoof ohne Compiler ... ?

                    Hatte gehofft jemand weiss hier was.
                    Auf die nächste PHP-Version hoffen geht auch ohne grossen Aufwand.

                    m.b.G. Rolf

                    1. 你好 Rolf,

                      Debugge doch mal mit z. B. curl -I. Da kannst du doch viel besser feststellen, was eigentlich passiert.
                      hmm,
                      gibt es das auch in deutsch und für Windoof ohne Compiler ... ?

                      http://curl.haxx.se/download/curl-7.19.3-win32-ssl.zip Generic Win32
                      http://curl.haxx.se/download/curl-7.19.3-win64-ssl-sspi.zip Generic Win64

                      再见,
                       克里斯蒂安

                      --
                      http://wwwtech.de/
                      IRC-Clients und Irssi-Scripting | Flyspray
                      Der Mund ist das Portal zum Unglück.
                      1. Hallo Christian,

                        »» Debugge doch mal mit z. B. curl -I. Da kannst du doch viel besser
                        »» feststellen, was eigentlich passiert.
                        http://curl.haxx.se/download/curl-7.19.3-win32-ssl.zip Generic Win32

                        das war einfach,
                        bis zur Fehlermeldung "libssl32.dll" nicht gefunden.
                        Na-ja, irgend etwas ist ja immer ... ;-)

                        m.b.G. Rolf

                        1. Hallo Christian,

                          »» »» Debugge doch mal mit z. B. curl -I. Da kannst du doch viel besser
                          »» »» feststellen, was eigentlich passiert.
                          »» http://curl.haxx.se/download/curl-7.19.3-win32-ssl.zip Generic Win32
                          das war einfach,
                          bis zur Fehlermeldung "libssl32.dll" nicht gefunden.

                          okay, das konnte ich beheben, aber das nicht mehr:
                           the last message from cURL.exe

                          m.b.G. Rolf

                          1. 你好 Rolf,

                             the last message from cURL.exe

                            Tut mir leid, das sagt mir auch nichts...

                            再见,
                             克里斯蒂安

                        2. Moin!

                          »» http://curl.haxx.se/download/curl-7.19.3-win32-ssl.zip Generic Win32
                          das war einfach,
                          bis zur Fehlermeldung "libssl32.dll" nicht gefunden.
                          Na-ja, irgend etwas ist ja immer ... ;-)

                          Es gibt curl auch in einer Nicht-SSL-Variante. Wenn du also kein SSL checken musst, wäre die zu bevorzugen - das Auflösen der DLL-Abhängigkeiten, um SSL in Betrieb zu nehmen, erfordert nach meiner Erfahrung einiges an Gefummel und Probier-Arbeit, die man vermeiden kann, sofern SSL nicht relevant ist.

                          - Sven Rautenberg

  2. Guten Tag,

    Worauf kann man diese Verzögerung zurückführen?
    Wie lässt sich der Bug beheben?

    <glaskugel>Hast du die Einstellung von implicit_flush geändert? Teste mal, ob du ein ähnliches Verhalten reproduzieren kannst, wenn du zwischen header() und exit ein flush() notierst.</glaskugel>

    Gruß
    Christoph Jeschke

    --
    Zend Certified Engineer
    Certified Urchin Admin
    1. Hi,

      <glaskugel>Hast du die Einstellung von implicit_flush geändert? Teste mal, ob du ein ähnliches Verhalten reproduzieren kannst, wenn du zwischen header() und exit ein flush() notierst.</glaskugel>

      da er normale Adressen problemlos aufrufen kann, denke ich dein Hinweis könnte vielleicht etwas bringen, aber wenn dann bei den Zieldateien. Zumal ich sowieso denke, das dort die Fehlerquelle zu suchen ist und nicht bei HEADER=>LOCATION.

      Hans

      1. Guten Tag,

        da er normale Adressen problemlos aufrufen kann, denke ich dein Hinweis könnte
        vielleicht etwas bringen, aber wenn dann bei den Zieldateien.
        Zumal ich sowieso denke, das dort die Fehlerquelle zu suchen ist und nicht bei
        HEADER=>LOCATION.

        Ist es nicht aber so, dass in seinen Logs ein Delta von 5 Sekunden zwischen den Seitenaufrufen auftaucht, dass eigentlich nicht auftauchen sollte? Das würde nämlich schon für eine Wartezeit beim verweisenden Skript sprechen, nicht beim Zielskript.

        Die lokalen Adressen könnten kürzer sein, als z.B. eine getestete externe Adressen. Dann würden genügend Daten übertragen und automatisch geflusht werden.

        Gruß
        Christoph Jeschke

        --
        Zend Certified Engineer
        Certified Urchin Admin