You are not logged in.

  • Login

1

Thursday, October 27th 2011, 7:00pm

PHP/Java chatScript

Hallöchen...

und zwar das Script:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Comet example 1</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<script type="text/javascript">
	function chat(txt) {
		document.getElementById("chat").innerHTML += txt;
	}
	</script>
</head>
<body>

<div id="chat"></div>

<?php
for($i=0; $i<10; $i++) {

	echo '<script type="text/javascript">';
	echo 'chat("<p>server is still alive at '.date('Y-m-d H:i:s').'</p>");';
	echo '</script>';

	// sende die Ausgabe zum Browser
	flush();
	
	// warte 0.2 Sekunden um den Server zu entlasten
	usleep(1000000);
}
?>

<script type="text/javascript">
chat("<p>server is done</p>");
</script>
</body>
</html>


liefert auf dem Webserver irgendwie nicht so das ergebniss wie auf dem Server beschrieben... Und zwar:

Wenn ich das

"usleep(1000000);" rausnehme zeigt er alles auf einmal an, lass ich es drin wartet er so lange mit der ausgabe bis er die 10 stellen fertig erzeugt hat...

Demo Easy-coding: http://demo.easy-coding.de/ajax/comet-ch…al/example1.php
Wiki Artikel: AJAX / Comet Chat Tutorial
Auf dem Webserver: http://test.the-icc-group.de/test.php

PHP info: http://test.the-icc-group.de/phpinfo.php

vieleicht weiß einer ein rat, was es sein könnte (das Gleiche Problem tritt auch beim Xampp V1.7.7 auf)...

greets

This post has been edited 1 times, last edit by "toxic" (Oct 27th 2011, 7:06pm)


2

Thursday, October 27th 2011, 7:07pm

Probiere mal ein ob_flush(); nach dem flush();

Ansonsten evtl gzip am Server deaktivieren, weiteres siehe http://php.net/manual/de/function.flush.php

3

Thursday, October 27th 2011, 8:05pm

Hallöchen...

THX, jetzt klappt es...

Eigendlich eine recht simple sache wenn man es weiß.

hab am ende dann noch "ob_end_flush()" gesetzt.

das einzigste was bleibt ist, das er nach eine gewissen zeit die Verbindung verliert und meint das Fenster zu refreshen.

Darüber ist mir gerade was eingefallen... warum nicht die ausleseroutine extra setzen (oder includen) und den rest dann einfach ausgeben lassen... (mal sehen ob es klappt).

Leider kein erfolg, da er, wenn er die verbindung verliert oder im Timeout geht nach der headeradresse springt und so das fenster refresht und komplett zurücksetzt...

greets

This post has been edited 3 times, last edit by "toxic" (Oct 28th 2011, 1:10am)


4

Friday, October 28th 2011, 9:35pm

Hallöchen,

weiß schon nicht mehr was ich alles machen soll.

hier nochmal das script:

vorweg, es geht alles von der "chatty.php" aus.

Source code

1
<FRAME SRC="oframe.php?id=<?php print $id?>" marginwidth="0" marginheight="0" name="Output">


aus...

-------------'oframe.php'---------

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
for($i=0; $i<999999999999999999999999999999999999999999999; $i++) {

ob_flush();

	print date("H:i");
	print "<br><script>scrollWindow()</script>";
			
	// sende die Ausgabe zum Browser
	ob_flush();
	flush();
	
	// warte x Sekunden um den Server zu entlasten
	usleep(500000);
	

}
?>


wenn das 'Oframe.php' nun abricht, dies passiert in ca4-8min geht er automatisch auf die Catty.php und da frag ich mich, weshalb er überhaupt abricht und auf die Chatty.php zurückgreift???? Wenn das Script ohne das Frame ausgeführt wird bricht er nicht ab (sprich es läuft ohne probleme durch).

weiß einer ein rat/tip???

greets

This post has been edited 1 times, last edit by "toxic" (Oct 28th 2011, 10:13pm)


5

Saturday, October 29th 2011, 11:57am

Also php scripte im Apache brechen irgendwann ab, das kann am Server liegen oder am Client. HTTP ist nicht dafür ausgelegt so lange Verbindungen zu handeln.

Ansonsten nochmal der Aufbau..
* chatty.php bindet einen iframe mit der oframe.php ein.
* oframe.php ist das script, das lange laufen soll.

Irgendwann hat oframe einen Timeout und bricht ab.
jetzt müsste sich irgendjemand darum kümmern, den iframe wieder zu starten.

Das ginge vermutlich mit JavaScript. Du kannst im ersten Flush der oframe.php einen Timer starten, der eine globale Variable prüft und die Seite bei Bedarf neu lädt.
Mit jedem Flush in der iframe solltest du diese globale Variable zurücksetzen.

Mal runtergetippt mit Pseudo javascript:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<script type="text/javascript">
function Chat() {
	this.timer = aktuelle uhrzeit;
	window.setInterval(this.checkInterval, 500);
 
	this.write = function(msg) {
		this.timer = aktuelle uhrzeit;
		document.getElementById('msg').innerHTML += '<p>' + msg + '</p>';
		scrollWindow();
	};
 
	this.checkInterval = function() {
		if(this.timer älter als 30 sekunden) {
			window.location.refresh();
		}
	};
}
var chat = new Chat();
</script>
 
<div id="msg"></div>
 
<?php
while(1) {
	print "<script>chat.write('hello world')</script>";
 
	// sende die Ausgabe zum Browser
	ob_flush();
	flush();
 
	// warte x Sekunden um den Server zu entlasten
	usleep(500000);
 
}

6

Saturday, October 29th 2011, 5:31pm

Hallöchen...

mal ganz ehrlich, ich bin noch immer so schlau wie vorher...

hier mal das komplette script...

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
for($i=0; $i<999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; $i++) {


ob_flush();

if ($s == 1){
$s=0;
}else{
       //setze den eintrag im chat
	if($result = $db->query("SELECT * FROM $roomy ORDER by id DESC LIMIT 1")){
			while ($data = $result->fetch_object() ){
			$eintragung = $data->id;
					
			if ($line_id < $eintragung){
			if ($data->message != "")print $data->message."<br>";
					//ob_flush();
					flush();
					//ob_end_flush()
                        print "<script type=\"text/javascript\">
			scrollWindow()
			</script>";
			$line_id = $data->id;
			}}
			
//setze private nachrichten im chat
if($result = $db->query("SELECT * FROM privat WHERE nick = '$nickname' ORDER by id DESC LIMIT 1")){
			while ($data = $result->fetch_object() ){
			$eintragung = $data->id;
					
			if ($line_id < $eintragung){
			if ($data->message != "")print $data->message."<br>";
					//ob_flush();
					flush();
					//ob_end_flush()
                        print "<script type=\"text/javascript\">
			scrollWindow()
			</script>";
			$line_id = $data->id;
			}}
	// sende die Ausgabe zum Browser
	ob_flush();
	flush();
	
	// warte x Sekunden um den Server zu entlasten
	usleep(500000);
	
}
}}


Ich hatte auch mal dein Example3 probiert, nur bekomm ich da nicht weitere Aufrufe mit hin (sprich, den Eintrag im Chat setzen geht nur nicht die Privaten eintragungen mit Abfrage)...

http://www.easy-coding.de/wiki/html-ajax…-php-mysql.html

In Grundegenommen könnt ich auch alles über eine Tabelle laufen lassen.

Was wohl auch die beste alternative ist, so mit dem Script.

greets

This post has been edited 11 times, last edit by "toxic" (Oct 30th 2011, 7:47pm)


7

Sunday, October 30th 2011, 7:29pm

Hallöchen...

Jetzt kommt ein neues Problem, da das script nicht 100% funktioniert...

sprich, aufem IE/avant bricht der stream ab ca beim 17malige anzeige (wird nix neues mehr angezeigt), was wiederum beim Firefox und Opera nicht ist...

Also so komm ich nicht wirklich weiter...

genutzt wird dieses script:

http://www.easy-coding.de/wiki/html-ajax…-php-mysql.html

hat eine eine brauchbare Idee???

Hab jetzt ein anderes Script gefunden, mal sehen wie das ist... thx für die Hilfe...

Greets

This post has been edited 3 times, last edit by "toxic" (Oct 31st 2011, 11:39pm)


Similar threads

Social bookmarks