• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Clients refreshen

Funktioniert irgendwie nicht.
Ich hab jetzt alles in mein bestehendes Skript eingebaut.
Nochmal die Site-Funktion als Zusammenfassung:

Jeder Client hat eine individuelle (dynamisch erstellte) Tabelle mit Werten. Die Werte kommen aus einer JSON-Datei vom Server.
Die Clients können ihre Tabelle ändern, dann wird per Ajax Post, über die "update.php" , in die JSON-Datei geschrieben.
In der "refresh.php" ist eine Endlosschleife, die abfragt, ob in der JSON-Datei "update=true", und sendet dann per SSE die Daten an die Clients.

Problem:
SSE kommt aber manchmal gar nicht, meistens im Browser der abgesendet hat, gelegentlich im Browser eines anderen clients.
nie aber in mehreren, oder allen clients.

Außerdem, nachdem ich ein paarmal geänderte Daten hochschicke, krieg ich für die "update.php" ne 503 zurück. (Service unavailable)

Folgend mal die wichtigsten Codeschnipsel:

Update.php - kriegt Änderungen gesendet, liest Daten.json aus, wandelt in ein Objekt, pflegt die Änderung ein und schreibt wieder in die Daten.json.
PHP:
<?php  
if(isset($_POST)) 
{
   $message = $_POST['message'];   
   $file = $_POST['file'];
   header("Refresh:0");   
   $Obj=json_decode($message); 
   var_dump($message);
   $user=$Obj->user;  
   $Gegner=$Obj->Gegner;
   $Wert=$Obj->Wert;
   $ausgezahlt=$Obj->ausgezahlt; 
   $h=fopen($file,'r+');
   if (flock($h, LOCK_EX))   
   {  	    
   	  $Daten=json_decode(file_get_contents($file));	 	  
	  $Daten->$user->$Gegner->Wert=$Wert;
	  $Daten->$user->$Gegner->ausgezahlt=$ausgezahlt;
	  $Daten->$user->istBenutzer=true;
	  $Daten->update = true;
	  fseek($h, 0);
	  ftruncate($h, 0);
	  fwrite($h,json_encode($Daten));   
	  flock($h, LOCK_UN);
   }  
   fclose($h);
}
?>

refresh.php - läuft in dauerschleife. liest Daten. json. bei update=true, SSE an clients
PHP:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while (1) 
{     
   $h = fopen('Daten.json', 'r+');
   if (flock($h, LOCK_EX)) 
   { 	  
	  $jsondata=file_get_contents('Daten.json');
	  var_dump($jsondata);
	  $obj=json_decode($jsondata);
	  var_dump($obj->update);
	  if($obj->update == true)
	  {  		   
		 echo "data: $jsondata\n\n";		 
		 ob_end_flush();
		 flush();
		 $obj->update = false;	  
		 fseek($h, 0);
		 ftruncate($h, 0);
		 fwrite($h,json_encode($obj)); 		 
	  }	
	  flock($h, LOCK_UN);  
	  fclose($h);
   }     
	sleep(1);
}
?>

SSE empfangen:
Code:
$(document).on( "pageshow", "#home",function(event) 
{
   var evtSource = new EventSource("refresh.php");
   evtSource.onmessage = function(e) 
   {

Werte aus Daten.json auslesen, modifizieren, und zur Update hochschicken
Code:
$.ajax(
   {
	  cache: false,
	  url: "Daten.json",
	  dataType: "json",
	  success: function(data) 
	  {
		 altewerte=data[user][Gegner]["Wert"];	
		 ausgezahlt=data[user][Gegner]["ausgezahlt"];
		 alterbetrag=parseFloat(altewerte[0].replace( ",","." ));
		 add=parseFloat($( "#Kassierdialog .Kassierform .ui-select .ui-btn-text" )[0].innerText.replace(",","." ));
		 add=add.toFixed(2);
		 alterbetrag=alterbetrag.toFixed(2);
		 var slider_value=$("#bezahlrichtung").slider().val();
		 if (slider_value=="out")
		 {
			 neuerbetrag=parseFloat(alterbetrag)-parseFloat(add);
		 }
		 else
		 {
			neuerbetrag=parseFloat(alterbetrag)+parseFloat(add);  
		 }

		 neuerbetrag=neuerbetrag.toFixed(2);
		 var eintrag=String(neuerbetrag).replace( ".","," );
		 if (add != 0)
		 {
			altewerte.unshift(eintrag);
		   if (altewerte.length>16)
		   {
			  altewerte.pop(); 
		   }
		 
		 } 
		 $.ajax(         /*Änderung hochladen*/
		 {
			type: "POST",
			url: 'update.php',
			data: {message :JSON.stringify({"user":user,"Gegner":Gegner,"Wert":altewerte,"ausgezahlt":ausgezahlt}), file: 'Daten.json'},  
			success: function(data)
			{
			   $.mobile.changePage($("#home"), { transition: "pop"});
			},		   
			error:function()
			{
				
			}
		 });
		 
	  }
   });
 
Zurück
Oben