Archiv verlassen und diese Seite im Standarddesign anzeigen : Apache/PHP - Ausführung von system(...) von Seitenaufruf loskoppeln
Ich starte über eine Webseite einen rechenintensiven Encoding-Prozess. Dieser Prozess dauert relativ lange, daher möchte ich, dass der Benutzer ihn (via Seitenaufruf/php) nur anstößt, dann aber gleich weiter surfen kann. Wenn ich jedoch die Encoding-prozesse via php: system(...) starte öffnet sich eine neue Seite erst wenn die Prozesse, die dort aufgerufen wurden beendet wurden.
Wie kann ich also mittels php aufgerufene Prozesse/Funktionen vom normalen Seitenaufruf loskoppeln? Geht das?
freue mich sehr über jede Idee.
Grüße,
Bernd.
Möglichkeiten gibt's viele:
(1) Du kannst den Prozess im Hintegrund starten
(2) Du kannst ein Flag setzen (z.B. eine Datei flag.txt "touch"en) und nach der mit einem CronJob suchen und bei existenz den Vorgang starten
(3) Du kannst den Auftrag in eine Liste aufnehmen und die dann zentral gesteuert abarbeiten
(4) ...
(1) Du kannst den Prozess im Hintegrund starten
Das klingt gut. Magst du mir auch einen Tipp geben wie das funktioniert? Gibt es dafür eine PHP-Handhabe?
(2) Du kannst ein Flag setzen (z.B. eine Datei flag.txt "touch"en) und nach der mit einem CronJob suchen und bei existenz den Vorgang starten
Das finde ich etwas unschön. Außerdem kann ich leider keinen Cronjob in derart kurzen Wiederholfrequenzen (beinahe Sekündlich) einrichten.
(3) Du kannst den Auftrag in eine Liste aufnehmen und die dann zentral gesteuert abarbeiten
hab leider keine Ahnung was du damit meinst.
(4) ...
ja...?
(1) mit angehängtem & aufrufen - man bash für Details bzw. Suchfunktion
(2) wenn der Prozess doch eh so lange dauert - ist das auch egal ob man noch eine Minute mehr oder weniger wartet?
(3) Ähnlich wie (2), nur werden z.B. sämtliche Jobs (File X bearbeiten) in einer DB, CSV, ... gespeichert und dann zeitgesteuert abgearbeitet (auch z.B. nachts um 3)
(4) man Kreativität
tut mir leid, dass ich noch nicht der oberlinuxprofi bin, der alle bash befehle kennt, nach denen ich dann sicher auch konkret suchen könnte.
Ich würde mich über eine konkretere Hilfe wirklich sehr freuen.
wenn der Prozess doch eh so lange dauert - ist das auch egal ob man noch eine Minute mehr oder weniger wartet? nein, ist leider nicht egal. der prozess muss schon mit dem klick beginnen.
(1) mit angehängtem & aufrufen - man bash für Details bzw. Suchfunktion
und das ist nicht konkret genug?
/usr/local/httpd/htdocs/blablub &
^^ glaube so in etwa...
achso.. ich hatte das "&" gar nicht als Teil eines Befehls wahrgenommen. ups..
Es gibt dabei jedoch das Problem, dass ich ja mehrere Prozesse nacheinander via system(...) aufrufe, die alle aufeinander aufbauen (mp3 decoding, signalveränderung, wav encoding). Entsprechend sollten die einzelnen Prozesse zwar im Hintergrund ablaufen, aber schon hintereinander und nicht blind nebeneinander oder jeder für sich in einem anderen Hintergrund (was doch eigentlich der Fall sein müsste wenn ich jeden einzeln mit "&" starte, oder?).
davon abgesehen, konnte ich bei einem manuellen test in der bash trotz "&" dennoch nicht gleich weiter eingaben machen, da wie vorher auch erst die ausgabe des programmaufrufs abgewartet wurde. (Mir ist unklar wie ich zu "&" die man aufrufen kann, da "man &" oder auch "man '&'" leider zu keinem Ergebnis führt..hmm)
tja, in dem Fall wirst Du dann wohl um die von mir oben vorgeschlagene Variante nicht drumherum kommen...
Einzig vielleicht ein Script schreiben, welches die Aktionen durchführt und dieses dann im Hintergrund starten...
AceTheFace
17.10.06, 09:48
achso.. ich hatte das "&" gar nicht als Teil eines Befehls wahrgenommen. ups..
Es gibt dabei jedoch das Problem, dass ich ja mehrere Prozesse nacheinander via system(...) aufrufe, die alle aufeinander aufbauen (mp3 decoding, signalveränderung, wav encoding). Entsprechend sollten die einzelnen Prozesse zwar im Hintergrund ablaufen, aber schon hintereinander und nicht blind nebeneinander oder jeder für sich in einem anderen Hintergrund (was doch eigentlich der Fall sein müsste wenn ich jeden einzeln mit "&" starte, oder?).
Du könntest die ja zusammen in ein (Bash-)Skript schmeissen und das dann im Hintergrund ausführen:
#!/bin/bash
befehl 1
befehl 2
befehl 3
Das als blubb.sh speichern, ausführbar machen (chmod +x) und dann mit "blubb.sh &" starten. Wenn du nun das einzelne Ende eines Befehls abfangen möchtest, geht das vielleicht über Umgebungsvariablen, die du nach den einzelnen Aufrufen setzt. Habe das noch nie gemacht aber evtl. funktioniert es ja...
Gruß,
Ace
EDIT: Mist, zu langsam....
Oder aber Client-seitig splitten: Entweder mit einem anderen (kleinen) "target"-Fenster, sodass die Pause dort entsteht, das eigentliche Fenster aber unberührt bleibt.
Das gleiche, aber moderner implementiert erreicht man mit AJAX, also im Hintegrund ein HTTP-Objekt aufmachen, dort den Request senden und dann wahlweise über den Zustand das Resultat monitoren und optional zur Anzeige bringen.
Greetz
Thomas
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.