Zur Navigation

Unterbrechbares PHP-Skript mit Speicherstand

1 Ranma (Gast)

Weil ich die Erfahrung gemacht habe, daß einige meiner Skripte Stunden oder sogar Tage brauchen, habe ich mir dagegen etwas einfallen lassen. Mein neuestes PHP-Skript liest einen XML-Dump und schickt Daten daraus an eine Datenbank.

Aber als erstes soll es ein kleines Formular ausgeben, das einen Knopf enthält mit dem man das Skript abschalten kann. Ist die dazugehörige POST-Variable gesetzt, dann soll die Position des Dateizeigers für die XML-Datei festgestellt werden und dieser Wert in einer kleinen Textdatei abgespeichert werden. Danach wird die WHILE-Schleife mittels break; verlassen, so daß das Skript nur noch die Datenbankverbindung beendet und beide Dateien schließt. Bei jedem Neustart holt das Skript den Wert für die Position des Dateizeigers aus der Textdatei. So hatte ich mir das zumindest vorgestellt.

Also das Skript ist so aufgebaut, daß es erst das kleine Formular ausgibt. Als nächstes kommt die Überprüfung des aktuellen Wertes für den Dateizeiger. Danach kommt die WHILE-Schleife, in der sowohl die XML-Datei verarbeitet wird als auch überprüft wird, ob die POST-Variable gesetzt ist. Einmal pro Schleifendurchlauf sollte das kontrolliert werden.

Weil das Formular (nach error_reporting und time_limit) am Anfang des Skriptes steht, hatte ich erwartet, daß es als erstes ausgegeben wird. Wenn ich die WHILE-Schleife auskommentiere, dann wird das Formular auch ausgegeben. Sonst aber nicht. Anscheinend möchte PHP erst das gesamte Skript abarbeiten, also die WHILE-Schleife bis zu ihrem Ende durchlaufen. Danach bringt die Abschaltmöglichkeit jedoch nichts mehr. Eine Unterbrechung ist ja nur sinnvoll, solange das Skript seine Aufgabe noch nicht vollständig beendet hat.

Läßt sich das korrigieren?
Oder ist an dem Konzept etwas grundlegend falsch?
Ranma

12.05.2016 02:21

2 Jörg Kruse

Das kann so nicht funktionieren. Erst wenn das Script fertig ist, wird die HTML-Ausgabe inklusive Formular an den Browser gesendet. Der Inhalt des Formulars wiederum würde an eine ganz andere Instanz des Scriptes gesendet werden.

Man könnte hier mit einer Run-Datei opiereren. Das Script legt als erstes eine solche Datei an. In der Schleife wird zusätzlich auf Vorhandensein der Run-Datei überprüft - falls diese fehlt, wird die Schleife wie von dir beschrieben verlassen.

Das Abbruch-Formular kann auf einer anderen Seite untergebracht werden. Falls dieses abgesendet wird, wird die Run-Datei gelöscht.

12.05.2016 21:39

3 Ranma (Gast)

Wie sieht eine Run-Datei aus? Wenn nur auf Existenz überprüft wird, dann reicht eine einfache Textdatei ohne Inhalt?

Wenn die Run-Datei keinen Inhalt hat und einfach nur angelegt und gelöscht wird, dann steht aber nirgendwo, wo das Skript stehengeblieben ist. Oder ist die Run-Datei zusätzlich zu meiner Speicherstandsdatei?

Wieso bringe ich das Formular auf einer anderen Seite unter? Noch eine Skript-Datei zu inkludieren dürfte nichts bringen. Das sollte keinen Unterschied dazu machen, alles direkt in eine einzige Skript-Datei zu schreiben. Meinst du das vielleicht so, daß die andere Seite keine Verbindung zu meinem Skript hat, sondern ein parallel auszuführendes Skript ist und die beiden Skripte über die Run-Datei miteinander kommunizieren?
Ranma

13.05.2016 01:33

4 Jörg Kruse

Du kannst auch was in die Run-Datei reinschreiben. Da die Run-datei aber gelöscht wird, wäre in diesem Fall wohl eine Lock-Datei besser:

Das Script überprüft auf Vorhandensein einer Lockdatei und liest diese gegebenfalls aus, um zu wissen, wo es weiter machen soll und löscht dann die Lockdatei. In der Schleife wird ebenfalls auf Vorhandensein der Lockdatei überprüft. Falls vorhanden, schreibt es den aktuellen Stand dort hinein und beendet das Script.

Beim Versenden des Abbruch-Formulars wird eine leere Lockdatei angelegt.

Meinst du das vielleicht so, daß die andere Seite keine Verbindung zu meinem Skript hat, sondern ein parallel auszuführendes Skript ist und die beiden Skripte über die Run-Datei miteinander kommunizieren?

Ja.

Falls du weißt, wieviele Schleifen das Script in einem Rutsch durchlaufen soll, und wie lange dies dauert, könntest du auch ein Script bauen, welches sich selbst wieder aufruft, um den nächsten Durchgang zu starten. Der erste manuelle Aufruf könnte so ausschauen:

http://www.example.com/script.php?step=0

Die HTML-Ausgabe enthält einen Meta-Refresh:

<meta http-equiv="refresh" content="10; URL=http://www.example.com/script.php?step=<?php echo ($_GET['step'] + 1) ?>" />

Anhand von $_GET['step'] kann das Script errechnen, an welcher Stelle es weiter machen muss

13.05.2016 18:14 | geändert: 13.05.2016 18:14

5 Ranma (Gast)

Gut. Ich habe jetzt mal meine Datei mit dem Speicherstand beibehalten und zusätzlich eine leere Textdatei angelegt. Einfach deswegen, weil der Teil mit dem Speicherstand sich ja schon in meinem Skript befindet. Das Formular habe ich in ein zweites Skript gepackt, das außerdem die Run-Datei einfach umbenennt statt sie ständig zu löschen und wieder anzulegen. Wenn ich ins htdocs-Verzeichnis gucke, dann heißt die Datei entweder an oder aus, je nachdem was mein Skript gerade tun sollte.

Leider weiß ich trotzdem nicht, ob das so funktioniert, weil sich noch vor diesem Abschnitt die Dauerschleife befindet. Würde ich die Abfrage nach der Existenz der Run-Datei dorthinein verlegen oder vor die Schleife, dann würde das Skript irgendwo bei unvollständigen Einträgen abbrechen, statt immer genau zwischen zwei vollständig verarbeiteten Einträgen. Also muß ich nun zunächst das Problem mit der Dauerschleife lösen.
Ranma

14.05.2016 01:43

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]