HTTPRequest und Statusanzeige der PHP Schleife

francosdad

Mitglied
Hallo,

ich arbeite mich gerade in das Thema Ajax ein und habe natürlich gleich ein paar Fragen.

Hier ist die erste.

Ich starte einen HTTPRequest und lasse in der gerufenen PHP Datei eine Schleife laufen. So lange die Schleife läuft, gilt das Dokument natürlich nicht als geladen.

Im Script der gerufenen PHP Seite wird ein Statusbalken erzeugt.

Wie bekomme ich das hin, dass der Statusbalken der noch nicht vollständig geladenen Seite trotzdem in der aufrufenden Seite angezeigt wird.

Im Moment arbeite ich mit dem folgenden Script für den HTTPRequest:

HTML:
function schleife(value) {

	// Request erzeugen
	if (window.XMLHttpRequest) {
		request = new XMLHttpRequest(); // Mozilla, Safari, Opera
	} else if (window.ActiveXObject) {
		try {
			request = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
		} catch (e) {
			try {
				request = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
			} catch (e) {}
		}
	}

	// überprüfen, ob Request erzeugt wurde
	if (!request) {
		alert("Kann keine XMLHTTP-Instanz erzeugen");
		return false;
	} else {

		var url = "schleife.php";
		request.open('post', url, false);
		request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		request.send('action=send');
		switch (request.status) {
			case 200:
				var content = request.responseText;
				document.getElementById('bounce').innerHTML = content;
				break;
			default:
				alert("Der Request wurde abgeschlossen, ist aber nicht OK\nFehler:"+request.status);
				break;
		}

	}
}

Vielen Dank für eure Tipps und Hinweise.

Gruss
Michael
 
Moin Michael,


zunächst müsstest du dafür sorgen, dass der Request asynchron durchgeführt wird, denn momentan erfolgt er synchron:
Code:
request.open('post', url, false);

Wenn ein Request synchron erfolgt, arbeitet dein Skript erst weiter, wenn der Request abgeschlossen ist, du hast dort also keinerlei Möglichkeit, zwischendurch mit etwaigen Rückmeldungen vom Server zu Arbeiten.

Asynchron wird der Request, wenn du den 3. Parameter von open() auf true setzt.

Dann hast du die Möglichkeit, den onreadystatechange-Event des Requests zu überwachen. Ein HTTP-Request hat 5 Zustände, hier die Beschreibung dazu: http://www.w3.org/TR/XMLHttpRequest/

feuert also der onreadystatechange-Event, und die readystate-Eigenschaft des Requests hat den Wert 3, heisst das, dass Daten geladen werden, der Request aber noch nicht abgeschlossen ist.
Dies wäre der Zeitpunkt, wo du die Statusanzeige ins Spiel bringen kannst....aber:
Welche Daten zu diesem Zeitpunkt bereits geladen wurden, ist dem Zufall überlassen,...anstatt also die Statusanzeige aus dem angefragten Skript heraus einbinden zu wollen, wärest du besser beraten, diese im anfragenden Skript selbst zu Erzeugen.
 
Hallo,

ich habe das jetzt wie folgt probiert:

HTML:
function schleife(value) {

	// Request erzeugen
	if (window.XMLHttpRequest) {
		request = new XMLHttpRequest(); // Mozilla, Safari, Opera
	} else if (window.ActiveXObject) {
		try {
			request = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
		} catch (e) {
			try {
				request = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
			} catch (e) {}
		}
	}

	// überprüfen, ob Request erzeugt wurde
	if (!request) {
		alert("Kann keine XMLHTTP-Instanz erzeugen");
		return false;
	} else {

		var url = "schleife.php";
		request.open('post', url, true);
                request.onreadystatechange = askforstatus();
		request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		request.send('action=send');
		switch (request.status) {
			case 200:
				var content = request.responseText;
				document.getElementById('bounce').innerHTML = content;
				break;
			default:
				alert("Der Request wurde abgeschlossen, ist aber nicht OK\nFehler:"+request.status);
				break;
		}

	}
}

function askforstatus () {
	switch (request.readyState) {
		case 1:
			var content = '	<center><span style="align: left">Verbindung wird hergestellt ...</span><br /><img src="EG/images/loading.gif"></center>';
			document.getElementById('bounce').innerHTML = content;
		break;
		case 3:
			var content = '	<center><span style="align: left">Vorgang wird ausgeführt...</span><br /><img src="EG/images/loading.gif"></center>';
			document.getElementById('bounce').innerHTML = content;
			alert(request.getAllResponseHeaders());
		break;
	}	
}

Es funktioniert soweit, dass "case 1" ausgeführt wird, aber eben nicht auf "case 3" geschaltet wird. Dies wäre ja die Stelle für die "Live"- Korrespondenz des aktuellen Status bzw. denn der Ausgabe der gerufenen Seite.

In dieser einfachen Version sollte also eigentlich auf "Vorgang wird ausgeführt..." umgeschaltet werden, oder sehe ich das falsch?

Auf der PHP Seite läuft eine einfache Schleife, die 100.000 Durchgänge hat und aller tausen ein print ausführt. Dieses möchte ich anzeigen, damit der User weiss, dass etwas passiert bzw. wieviel noch passiert.

Danke und Grüsse
Michael
 
Es obliegt wie bereits erwähnt dem Zufall, ob und was du bereits vor dem readyState 4 Daten als Antwort bekommst:
ich hat gesagt.:
Welche Daten zu diesem Zeitpunkt bereits geladen wurden, ist dem Zufall überlassen,...anstatt also die Statusanzeige aus dem angefragten Skript heraus einbinden zu wollen, wärest du besser beraten, diese im anfragenden Skript selbst zu Erzeugen.
Eine Echtzeit-Prozentanzeige o.ä. wirst du auf diesem Weg also nicht bewerkstelligen können.
 
Hallo,

das ist natürlich nicht schön zu hören :mad:

Wie würdest Du so etwas realisieren?

Das Problem ist, dass das Script mit der Schleife am Ende sehr aufwendige Operationen durchführt, welche durchaus 30min bis 60min dauern können.

Damit der User natürlich nicht wegklickt, muss er aktiv merken das etwas reelles passiert.

Wenn ich nur eine Standardanimation laufen lasse, dann denk er irgendwann der Browser ist abgestürt oder so ähnlich.

Grüsse
Michael
 
OK, das macht natürlich Sinn, es gibt da natürlich Workarounds, auf die ich nicht eingehen wollte, da sie bei einem Request, der nur ein paar Sekunden läuft, nicht viel Sinn machen.

Du könntest, sobald du den Request gestartet hast, eine weitere Routine starten, welche den aktuellen Ladestatus ermittelt.

Denkbar wäre bspw. Folgendes:
Dein Skript, was da so lange braucht, gibt den Ladestatus nicht aus, sondern schreibt ihn alle x Sekunden in eine Session-Variable. Diese Variable könntest du abfragen, indem du bspw. in Intervallen einen Request an ein anderes Skript startest, welches lediglich diesen Status ausgibt.

Auch jenes wäre evtl. möglich:
Anstatt in einer Session-Variable speicherst du den Wert jeweils in einem Cookie, und fragst diesen per JS in Intervallen ab. Das würde dir(dem Server) die wiederholten Requests erparen.
Allerdings hab ich das noch nicht probiert und weiss nicht, ob das externe Ändern von Cookies nach dem Laden eines Dokumentes im Dokument selbst verfolgbar ist.
 
Hallo,

also das mit dem zweiten Request ist eine ziemlich gute Idee; scheint auch soweit zu funktionieren.

Jedoch hab ich so meine Probleme auf eine Session Variable zuzugreifen, welche durch eine andere Funktion in einem anderen Script erzeugt wurde.

Hast Du da noch einen Tipp?

Gruss
Micha
 
Wo, wann, von wem Session-Variablen geändert/gelesen werden, spielt eigentlich keine Rolle.
Du musst nur überall die Session starten und sicherstellen, dass die Session-ID übertragen wird(für den Fall, dass dies nicht per Cookie passiert also bspw. über die URL).

Prüfe das am besten zuerst, ob die Session-ID verfügbar ist.
 
Anscheinend bin ein noch ein ganz schöner Frischling.

Ich habe da gerade ein Denkproblem, ich versuch das mal darzustellen:

Hauptscript (Hier wird die Session gestartet) -> schleife,php (Hier wird die Schleifeausgeführt und der Status sollte in das Session Array geschrieben werden)

Das getStatus.php Script wird per HTTPRequest durch den HTTPRequest welcher schleife.php aufruft aufgerufen (Verstanden?).

Das getStatus.php Script soll nun aus dem Session Array den Status auslesen und ausgeben. Wenn ich jedoch mit print_r mir das Session Array ausgeben lasse, ist es leer.

Wie greife ich im getStatus.php Script die Session auf und kann diese auswerten?
Muss ich die Session mittels HTTPRequest mit an das getStatus.php Script übergeben? -> wenn ja, wie mache ich das am schlausten?

Vielen, Vielen Dank.
Grüsse
Michael
 
Hi Michael,

Das getStatus.php Script wird per HTTPRequest durch den HTTPRequest welcher schleife.php aufruft aufgerufen (Verstanden?).

Nö. :-(

Wie greife ich im getStatus.php Script die Session auf und kann diese auswerten?

Du musst in dem Script, wie in jedem anderen auch, die Session starten. Wenn die Session-ID übertragen wurde, sind die Sessiondaten dann auch verfügbar.

Muss ich die Session mittels HTTPRequest mit an das getStatus.php Script übergeben? -> wenn ja, wie mache ich das am schlausten?

Wenn die Session-ID in einem Cookie gespeichert wird und Cookies bei Dir aktiviert sind, sollte dieses Cookie automatisch mitübertragen werden. Prüf mal Deine Cookies.
Wenn nicht, dann müsstest Du die Session-ID als GET-Parameter an die URL anhängen. Lies am Besten mal Passing the Session ID.

LG
 

Neue Beiträge

Zurück