PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Apache/PHP - Ausführung von system(...) von Seitenaufruf loskoppeln



ohrobot
16.10.06, 10:24
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.

marce
16.10.06, 10:40
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) ...

ohrobot
16.10.06, 12:31
(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...?

marce
16.10.06, 12:59
(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

ohrobot
16.10.06, 13:07
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.

marce
16.10.06, 13:09
(1) mit angehängtem & aufrufen - man bash für Details bzw. Suchfunktion
und das ist nicht konkret genug?

busted
16.10.06, 14:26
/usr/local/httpd/htdocs/blablub &

^^ glaube so in etwa...

ohrobot
17.10.06, 10:42
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)

marce
17.10.06, 10:44
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, 10: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....

tschloss
17.10.06, 12:58
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