| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

19-05-2005, 09:38
|
|
ankh
Member
|
|
Registriert seit: May 2005
Beiträge: 304
|
|
HTTP Return und Scriptfortführung
Moin zusammen!
Folgende Ausgangssituation:
Eine beliebige HTML datei greift zur parameterübergabe auf ein PHP Script zu.
Das Script wertet die Parameter aus, schreibt eventuell ein paar einträge in 'ne Datenbank und fertig.
Problematik:
Da HTTP Socketmässig blockt wartet der Browser mit dem weiterladen bis das Script durchgenudelt ist.
Das muss aber eigentlich nicht sein, da ja lediglich parameter übergeben werden sollen.
Frage:
Gibt es eine Möglichkeit vom Script aus dem Brwoser mitzuteilen, dass er weiterladen kann während das Script selbst weiterhin durchläuft und seine Auswertungen fährt?
Schon mal danke im Voraus....
GreeZ
|

19-05-2005, 13:28
|
Shurakai
Master  
|
|
Registriert seit: May 2004
Ort: Bergisch Gladbach
Beiträge: 3.090
|
|
Du könntest output buffering verwenden. Aber damit kann auch nur geladen werden was VOR dem Script liegt, weil alles von oben nach unten durchläuft.
|

19-05-2005, 13:31
|
 |
Nezzar
wannabe batard
|
|
Registriert seit: Mar 2002
Beiträge: 477
|
|
Eventuell kannst du da was flush() machen. Die Ausgabe wird dann schon mal an den Browser gesendet, während das Script weiterläuft.
__________________
"Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender
|

19-05-2005, 14:31
|
|
Quetschi
PHP Expert
|
|
Registriert seit: Dec 2004
Beiträge: 2.759
|
|
Hallo,
du könntest das ganze in 2 Skripte aufteilen:
Das 1. Skript nimmt die Parameter entgegen
Das 2. Skript nimmt deinen DB eintrag oder sonst was vor.
Das 2. Skript rufst du im 1. Skript per exec() auf, da gibts irgendnen Parameter dazu, dass das ganze in nem eigenen Prozess gestartet wird. Dann läuft das 1. Skript praktisch ohne Verzögerung bis zum Ende durch.
|

19-05-2005, 16:54
|
|
ankh
Member
|
|
Registriert seit: May 2005
Beiträge: 304
|
|
exec() wär an sich 'ne idee...
aber wenn ich von script1 exec(script2, args[]) aufrufe, dann wartet script1 ja trotzdem auf die Rückkehr der Funktion...
damit hab ich ja auch nix gewonnen
|

19-05-2005, 16:58
|
|
Quetschi
PHP Expert
|
|
Registriert seit: Dec 2004
Beiträge: 2.759
|
|
Eben nicht, wenn man's richtig macht.
Zitat:
|
Das 2. Skript rufst du im 1. Skript per exec() auf, da gibts irgendnen Parameter dazu, dass das ganze in nem eigenen Prozess gestartet wird. Dann läuft das 1. Skript praktisch ohne Verzögerung bis zum Ende durch
|
Schau mal hier!
Ich hatte ein ähnliches Problem.
|

19-05-2005, 19:23
|
|
ankh
Member
|
|
Registriert seit: May 2005
Beiträge: 304
|
|
Das klingt schonmal recht gut, damit könnte ich also dieses problem eliminieren.
aber:
auf das script, dass dann per exec() ein weiteres aufruft, welches in einem eigenen prozess gestartet wird, wird sehr viele Zugriffe erhalten.
Das aktuelle Script läuft bei hohem traffic bis zu 10 sek.
ergo: es wird sehr viele Prozesse starten und dann wird mir wahrscheinlich der Server in die Knie gehen.
|

20-05-2005, 09:04
|
|
Quetschi
PHP Expert
|
|
Registriert seit: Dec 2004
Beiträge: 2.759
|
|
Das Problem hast aber dann so oder so und hat wenig bis nichts mit der Auslagerung dieses Sripts zu tun.
Hast nen eigenen Server oder nur Webspace? Wenn du viel Traffic hast und damit viel Arbeit für den Server verbunden ist wirst über kurz oder lang an so Sachen wie Load-Balancing denken müssen.
|

20-05-2005, 09:29
|
|
ankh
Member
|
|
Registriert seit: May 2005
Beiträge: 304
|
|
das problem an sich hab ich sowieso, stimmt.
Allerdings, das erzeugen eines neuen Prozesses erzeugt, imho, auch etwas mehr overhead als die Verwendung von PHP als Apache Modul.
Load Balancing ist auch in Planung, weil ablaufdauer einfach unter aller sau ist...
Mal davon agbesehen, dass sich aus dem code auch noch die ein oder andere msec rausoptimieren lässt.
|

20-05-2005, 10:11
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Ein Browser erkennt, dass das Laden beendet ist, wenn die Content-Length wie im Header angegeben erreicht ist oder ein EOF kommt oder die Verbindung beendet wird. Oder? (großes, ernstzunehmendes Oder, denn ich rate nur)
|

20-05-2005, 10:21
|
|
Quetschi
PHP Expert
|
|
Registriert seit: Dec 2004
Beiträge: 2.759
|
|
ja, aber das war ja nicht das eigentliche Problem.
|

20-05-2005, 11:30
|
|
ankh
Member
|
|
Registriert seit: May 2005
Beiträge: 304
|
|
Also, erstmal danke an Quetschi
leider wartet bei mir script 1 auf die Rückkehr von exec(), selbst wenn ich die Ausgabe umleite...
zum testen hab ich leider nur ein Win System, und ich gehe mal davon aus, dass sich eine windows shell nicht in den Hintergrund schieben lässt.
Oder ich hab den stream falsch umgeleitet...
|

20-05-2005, 11:35
|
|
Coragon Rivito
Master
|
|
Registriert seit: Oct 2002
Ort: Mils/AT
Beiträge: 910
|
|
.. eine windows shell lässt sich in den hintergrund schieben, mach ich doch schließlich momentan auch so ..
exec('dein_befehl_zum_ausführen > gewünschte_umleitung');
/dev/null gibts ja leider nicht, also such dir irgend eine temporäre datei
PHP-Code:
do $file = $_ENV['TEMP'] . '\\' . sha1(microtime(true)) . '_phpTmp';
while (file_exists($file));
irgendwie so in der art - das while sollte eigentlich gar ned greifen, da es zu keinem konflikt kommen sollte, habs trotzdem mal eingebaut, ist ja nur eine zeile + do
__________________
mfg,
Coragon
|

20-05-2005, 11:53
|
|
ankh
Member
|
|
Registriert seit: May 2005
Beiträge: 304
|
|
hmm... das file_exists() is tatsächlich net nötig, da die datei, falls nicht vorhanden, angelegt wird.
momentan leite ich in 'ne logdatei um, also nicht mehr in STDOUT.
Trotzdem wartet das exec() aufrufende script.
mal mit code:
PHP-Code:
$f = $_ENV['TEMP']."/".sha1(microtime(true))."._tmp";
exec("PHP {$_SERVER['DOCUMENT_ROOT']}exectest/sqlexec.php \"{$args[1]}\" \"{$args[3]}\" > $f");
|

20-05-2005, 11:59
|
|
Quetschi
PHP Expert
|
|
Registriert seit: Dec 2004
Beiträge: 2.759
|
|
Weiß jetzt ned wie das unter Windows geht, aber musst du PHP nicht mit PHP.exe aufrufen?
@Coragon
PHP-Code:
exec("php4 ".$DOCUMENT_ROOT."/pfadzum/skript.php > /dev/null 2>&1 & echo $!");
> /dev/null : leitet an den 'Papierkorb' um, soweit sogut
aber was ist das noch?
> 2>&1 & echo $!
Muss gestehen, dass ich das damals einfach von irgendwo übernommen hab und es hat funktioniert. Aber würd schon ganz gerne wissen was ich da überhaupt angestellt hat
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|