![]() |
[PHP] Endlos-Umleitungsschleife, wieso?
Hallo,
ich habe eine Datei (index.php) die ganz grob so aussieht:
Code:
Die Funktion parse() parst Dateien, die in einem Verzeichnis liegen. Wenn eine Datei erfolgreich geparst wurde, wird der geparste Inhalt gespeichert. Dann wird die index.php erneut aufgerufen.
<?php
function parse() { // ... } if (parse()) { header('Location: index.php'); exit; } ?> Beim Versuch, die gleiche Datei erneut zu parsen, wird geprüft, ob diese bereits existiert. Ist das der Fall, gibt die Funktion parse() "false" zurück und die nächste Datei im Verzeichnis wird geparst. Das geht theoretisch so lange, bis alle Dateien geparst sind. Leider nur theoretisch. Nach rund 10-15 Dateien meldet Firefox einen Umleitungsfehler: "Die aufgerufene Website leitet die Anfrage so um, dass sie nie beendet werden kann." Drücke ich F5, dann läuft das Skript einwandfrei weiter und parst die nächsten 10-15 Dateien bis zum nächsten Umleitungsfehler. Wieso kommt es denn zu einer (Endlos-)Umleitungsschleife oder was mit FF damit sagen möchte? :gruebel: Edit: Es handelt sich übrigens um eine Klasse und da rufe ich das innerhalb einer Methode auf. Es ist natürlich unschön, eine Klasse bzw. Methode so zu verlassen, aber das sollte erstmal keine Rolle spielen und das werde ich auch noch ändern. Grüße, Matze |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Nach einer gewissen Zahl Redirects auf _immer die selbe Seite_ vermutet der FF, dass das auf Ewig so weitergeht. Häng' einfach einen Parameter, vielleicht nen Integer, dran, und das sollte sich ändern ;)
|
Re: [PHP] Endlos-Umleitungsschleife, wieso?
*nochmals überleg*
Das header('Location: index.php'); weißt ja den Browser an eine andere Seite zu laden, statt diese hier. (HTTP/1.0 303 ?) ich würd mal denken, daß FireFox eine maximale Rekursionstiefe eingebaut hat, damit es nicht endlos läd. war das eigendlich dein eigener Server? ich kann bei meinem Space das Timeout abschalten und auch den Abbruch seitens Browser irgnorieren lassen ... könnte also EIN Script "ewig" laufen lassen und dann alle Dateien auf einmal verarbeiten. [add] Tipp: wenn du das Timeout bei dir auch abschalten/hochsetzen kannst schicke nach jeder Datei eine (Status)Zeile an den Browser (incl flush buffer, damit es auch sofort verschikt wird) und verarbeite soviele Dateien, bis der Browser die verbindung trennt ... soviel wie möglich in einer Datei nach 'ner gewissen Zeit könnte man ja per Meta-Tag oder Java-Script dem Browser einen Reload-Befehl schicken, wo er dann die Datei erneut läd und beendet dabei gleich die aktuelle Datei (die Neue wird ja vermutlich gleich gestartet) ... somit würde man das Script nicht ewig laufen lassen. |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Hi ihr zwei!
@Dax: Das hat leider nichts zum Erfolg geführt. @himi: Mir ist bewusst, dass ich das PHP-Timeout höher setzen kann. Ob es der Server zulässt habe ich nicht getestet. Aber das einfach auf 10 Minuten zu setzen und hoffen, dass alle Dateien in der Zeit durchlaufen werden, gefällt mir nicht. Und nein, es ist kein eigener Server im Sinne von "mir gehört die Hardware". Ich habe halt so ein Web-Paket im Internet (Webspace etc.). Das ganze möchte ich nachher per Cronjob vielleicht 1 x pro Woche/Tag ausführen. Wenn diese Umleitungsschleife vom Browser irrtümlich angenommen wird, dürfte ich das Problem beim Cronjob eigentlich nicht haben. Daher geht die Meta-Tag-Lösung auch nicht. Vielleicht ist es wirklich nur der Browser, der mich veräppeln möchte und alle geht wie es soll. Wobei es natürlich schön wäre, wenn das auch über den Browser funktionieren würde. Grüße, Matze |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Ein Cronjob folgt aber, glaube ich, doch gar keinen redirects?
Und probier doch mal wget statt Browser, oder ein kleines Indy-Programm, das nix weiter tut als Redirs zu folgen ;) |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Hm meinem Cronjob gebe ich an, dass eine PHP-Datei ausgeführt wird. Und eine header()-Weiterleitung wird meines Wissens nicht vom Browser ausgeführt, dafür geht die viel zu schnell.
Wenn ich wüsste, was ein Cronjob so alles macht. Einen Tag mal ein winziges digitales Männlein zu sein, das in den Serverprogrammen schaut, wie das so funktioniert, wäre was ... :stupid: |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Delphi-Quellcode:
doch doch ... Herader wird an den Browser geschickt und der wertet es aus :angel:
Und eine header()-Weiterleitung wird meines Wissens nicht vom Browser ausgeführt, dafür geht die viel zu schnell.
|
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Achso hm, dann ist der aber sehr fix. Dann geht das mit header() ja gar nicht so, wie ich es mir vorgestellt hatte. :(
|
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Nimm einfach wget, das gibts für Windows und ist bei Linux fast immer dabei ;)
Code:
wget --max-redirect=999999 [url]www.dein.name/pfad[/url] -O /dev/null
|
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Für das aktuelle Problem zwar nicht geeignet, aber vielleicht liest das ja auch mal jemand, der das Problem außerhalb von Cron-Job hat: Müsste man mittels AJAX lösen können. Die Hauptseite macht immer einen AJAX Call auf die parse-Routine und die meldet einen Status zurück. Je nach Status dann nochmal aufrufen oder den Aufruf beenden.
Bei nem Cronjob wird das ja sicherlich nicht funktionieren. Da könnte man höchstens etwas "optimieren" und sagen wir mal jeweils 5 Dateien parsen vor dem Redirect. Das würde die Wahrscheinlichkeit in den Timeout zu rennen erhöhen, aber dafür die Anzahl der nötigen Redirects fünfteln. |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Hallo,
das Problem ist bei einem Cronjob nur, dass ich keinen Redirect machen kann, wenn ich das richtig verstanden habe, oder? Grüße, Matze |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Hallo Matze,
nur mal so eine Frage: Ist das Neuladen der index.php wirklich notwendig? Ansonsten könnstest du ja erstmal alle Dateien in dem Verzeichnis parsen und dann den Redirect veranlassen. |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Zitat:
|
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Hallo,
richtig. Ich möchte damit das PHP-Timeout umgehen ohne über set_time_limit() gehen zu müssen. Nicht alle Dateien lassen sich innerhalb der verfügbaren Zeit parsen, die meisten jedoch. Grüße, Matze |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Da würde ich an deiner Stelle doch mal den Vorschlag von himitsu versuchen:
Zitat:
|
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Zitat:
|
Re: [PHP] Endlos-Umleitungsschleife, wieso?
kannst du den Cronjob nicht mehrmals am Tag auf dein Script loslassen?
z.B. Stündlich dann jeweils nur ein Script bis zum Timeout laufen lassen und beim nächsten Mal fortsetzen oder eben wenn nichts mehr da ist, einfach nichts machen :angel2: |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Zitat:
Nach einer Anzahl von Redirects, bricht jeder Browser ab um z.B. Endlosschleifen zu vermeiden. |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Das ist aber auch bissl schlampig.
Notfalls lasse ich die vorhandenen Dateien "manuell" über den Browser parsen (geht ja mit ein paar F5-Drücken) und lade die dann hoch. Wenn ich das Skript dann täglich ausführen lasse, sollte es nur jeweils eine Datei zu parsen haben und das geht innerhalb des Timeouts. Es wäre halt schön gewesen, wenn ich die PHP-Datei ändere, einfach die geparsten Dateien löschen. Beim nächsten Durchlauf werden alle Dateien dann aktualisiert. Grüße Edit: Könnte ich theoretisch 2 identische Dateien anlegen, jedoch mit unterschiedlichem Redirect-Header? Und immer von der einen auf die andere weiterleiten lassen? :lol: Natürlich ginge das per Cronjob nicht, aber nur mal so als Spinnerei. Oder ist die maximale Redirect-Anzahl unabhängig von der aufgerufenen Datei? |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Zitat:
|
Re: [PHP] Endlos-Umleitungsschleife, wieso?
*grml* Nein Meta, Java, AJAX all das geht nicht, wie oft denn noch. ;)
Edit: Im Browser geht es vielleicht, doch primär geht's mir ja darum, das in einem Cronjob auszuführen. |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Hatte ich auch nur aufgeführt, weil du im letzten Beitrag von einer manuellen Ausführung gesprochen hattest...
Gewöhn dich einfach dran, dass das, was du machen willst, per CronJob nicht geht, es sei denn, du hast Zugriff auf die Shell, dann könnte es wie von Dax beschrieben gehen. Vielleicht könntest du ja mal mit deinem Hoster reden, ob die für dich regelmäßig das Script ohne Laufzeitbeschränkung ausführen können. |
Re: [PHP] Endlos-Umleitungsschleife, wieso?
Ok. Also ich denke das Thema ist hiermit erledigt. Du hast es ja schön zusammengefasst: Ohne Shellzugriff geht es per Cronjob wohl nicht. :(
Danke für eure Beiträge. Grüße, Matze |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz