• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Zwischenschritt bzw. Zwischenstatus ausgeben

miniA4kuser

Lounge-Member
Das Hauptproblem ist das weiter verarbeiten eine großen XML-Datei.
Diese soll in mehreren Schritten und nach mehreren Parametern bearbeitet werden.

Um die 30 Sekunden max_execution_time zu umgehen ruft sich das Script mit entsprechenden Parametern selbst auf, bis die Datei komplett durchgeackert ist. Der Nachteil ist jedoch das bis dahin der Browser nur ständig am Laden ist und das Gefühl entstehen kann das das Script hängt oder was auch immer...

Das Script ansich funktioniert soweit einwandfrei. Es wird auch die korrekte Gesamtzeit ausgegeben, welche benötigt wurde um die Datei zu bearbeiten. Bei meinen Tests war jetzt die längste Gesamtzeit 95 Sekunden.

Daher habe ich mir vorgestellt so eine Art Zwischenstatus ausgeben zu lassen. Ob nun als Prozessbalken oder Prozentwert oder wie auch immer, das weiß ich noch nicht. Vielmehr geht es mir darum eine Art Rückmeldung zu geben, das das Script noch am arbeiten ist.

Muss ich dafür die Parameter durch eine Zwischenseite schleifen, welche eine Art Weiterleitung macht?
Oder mit einer Session arbeiten?

Narf... ich steh gerade irgendwie voll auf der Leitung und wäre für Denkanstösse wirklich dankbar.
 
Ich mach sowas immer ganz einfach: Der Serverprozess A schreibt seinen Fortschritt in eine Datei. Der Browserprozess pollt per wiederholendem Ajax alle 2 Sekunden gegen ein zweites Serverscript B (es kann auch das selbe sein, dann halt mit Parametern), welches den Inhalt dieser Fortschrittsdatei ausliefert. Daraus kann der Browser dann einen Balken oder was auch immer anzeigen. Bei Ende des Vorgangs schreibt Prozess A ein Ende-Flag in die Datei (z.B. \x01) in die Datei welches den Browserprozess dazu veranlasst, "Fertig" zu zeigen.
 
Heißt also der Browserprozess (HTML mit AJAX) startet Serverprozess A (PHP_A) und ein zweiter AJAX-Request pollt Serverprozess B (PHP_B)?
 
Ja, wobei es nicht darauf ankommt, was da A oder B ist und ob das zwei oder nur ein Script sind. Die Fortschrittsdatei ist das wichtige Element. Denn der eine Prozess schreibt kontinuierlich, darf und muss die Datei also nur immer für einen kurzen Moment exklusiv sperren und schreiben, der andere liest sie immer dann, wenn der Browser den Fortschritt abholen will und die Datei frei ist. In Perl sieht das so aus: Prozess A öffnet die Fortschrittsdatei bei jedem Schritt mit O_WRONLY|O_APPEND|O_CREAT, flockt mit LOCK_EX|LOCK_NB und schließt sofort wieder. Der Prozess B öffnet mit O_RDWR und flockt ebenfalls mit LOCK_EX|LOCK_NB.
Also das saubere Dateihandling der Fortschrittsdatei ist das ganze Geheimnis. Wie man das in PHP abbildet und wie PHP sich verhält wenn z.B. der flock() nicht auf Anhieb klappt weiß ich leider nicht. Wichtig ist, dass jeder Prozess jeweils exklusiv zugreift, sonst klappt das nicht.
 
Hmm Perl ist jetzt nicht meine Welt...
Aber da in der erwähnten Datei eh kaum was drinnen stehen wird könnte ich doch auch eine Session starten und die Info dort in einer Variable speichern oder?
 
Bei einer Session hast du exakt das gleiche Problem, weil die auch in einer Datei gespeichert wird - und das auch nur, wenn du die Session mit session_write_close() schließt oder das Skript fertig ist.
Ich würde da eher über eine DB arbeiten..
 
Zurück
Oben