Schleife zeitgesteuert beenden

Hallo zusammen,

da es ja einen kleinen Bug in IPS bezüglich der FHZ und COM-Port-Instanzen
beim Neustart des Servers gibt, möchte ich eine saubere Unterbrechung
einer Schleife einbauen.

Problem:

Ich öffne einen COM-Port mit PHP
sende einen Befehl und warte auf die Rückmeldung.
diese wird dann in einer Schleife gesammelt bis eine
bestimmte Anzahl von Werten da ist.
Ist ja soweit kein Problem.

Wenn jetzt warum auch immer , sei es durch den Bug in IPS
oder ein Problem bei der Rückmeldung dazu kommt, das keine Daten
zurück kommen bleibt das Script bis zum Timeout in der Schleife stehen.

Durch das Abbrechen des Scripts wird dann ja auch der COM-Port nicht
geschlossen.

fwrite ($fp, ($Command.$Ckecksum));
    	ips_sleep(250);
    	$contents = "";
		while (!feof($fp)) {
  $contents .= fread($fp, 101);
}
 fclose ($fp);

Der ips_sleep ist dazu da mit der Schleife nach dem Senden zu warten bis die Daten kommen.
Hat jemand eine Idee wie ich die Schleife zeitgesteuert unterbrechen kann ?
Ich denke es sollte mit „break“ gehen. Aber wie setzte ich eine Zeit um den Break
auszuführen. Sagen wir mal z.B. wenn 10Sek keine Daten zurück kommen.

Perfekt wäre dann natürlich wenn der Break auftritt die I/O Instanz FHZ zu schließen und neu zu öffnen
gibt es da einen Befehl ?

Im Voraus schon mal besten Dank für eure Anregungen

Gruß Udo

Hallo,

du könntest einfach eine for Schleife bauen. Abbruchbedingung der While-Schleife einbauen (per IF) und die maximale Anzahl auf 40 setzen für 10 Sekunden (250ms410)

z.B.:


fwrite ($fp, ($Command.$Ckecksum)); 
ips_sleep(250); 
$contents = ""; 
for($i=0;$i<40;$i++){ 
   if(!feof($fp)) { 
      $contents .= fread($fp, 101); 
   } 
}
fclose ($fp); 

Versuch es doch mal so:


    fwrite ($fp, ($Command.$Ckecksum)); 
    ips_sleep(250); 
    $contents = "";
    try {
        while (!feof($fp)) { 
             $contents .= fread($fp, 101); 
        }
        fclose ($fp);
    } catch (Exception $exc) { 
         fclose ($fp);
    }  

Ich weiss aber nicht, ob der „catch“-Block beim erreichen der max. Skriptlaufzeit noch ausgeführt wird.