Script Fehlerhaft Information

Hallo IPS Gemeinde,

ich nutze ein PHP Script welches über ein Event gestartet wird.

Um mehrfaches gleichzeitiges Starten des Scripts zu verhindern deaktiviere ich eben jenes Event bei Scriptstart.

Wenn das Script seine Arbeit getan hat aktiviert es das Event nun auch wieder.

Das Script holt nun Bilder von einer Webcam und Speichert diese ab.
Leider kommt es gelegentlich dazu das die Kamera nicht erreicht wird, dann
schmeisst file_get_contents einen Error, das Script wird abgebrochen und als Fehlerhaft markiert.

Natürlich wird das Event dann auch nicht mehr aktiviert.

Gibt es eine Möglichkeit das Problem zu erkennen und dass Event wieder zu aktivieren? Das Script würde ja beim nächsten Aufruf wieder einwandfrei arbeiten.

Auszug aus dem Script:

				while ( $piccount > 0 ) {
  			 	     $daten = file_get_contents('http://user:pass@192.168.1.252/jpg/image.jpg');

			        $datum = date('Y-m-d-His');
   			     $verbindung = fopen("$pathneu/$datum.jpg", "w");
	   		     fwrite($verbindung, $daten);
   	   		  fclose($verbindung);
					usleep(500);
					$piccount = $piccount - 1;
				
	   		}

Danke und Gruß Martin

Du könntest besser Semaphoren nutzen.

Dadurch würde das Event bleiben, das Script auf jeden Fall aufgerufen und wenn es bereits einmal läuft, kannst du das neu gestartete sofort beenden.

Hi,

Ja aber so wie ich das mit den Semaphoren verstehe müssen die auch wieder gelöscht werden, was passiert also wenn das Script vorher beendet wird und die Semaphore bestehen bleibt?

Da habe ich doch dann genau das gleiche Problem oder?

Hi,
ich meine Du kannst vor das file_get_contents ein @ setzen und dann auf false/true prüfen um den Erfolg abzufragen.
Grüße, Benjamin

Im Prinzip ja, aber dein Script läuft und du kannst prüfen, wie lange der Semaphore gesetzt ist.
Falls das „ziemlich lange“ ist, dann löscht du ihn weg und führst deinen Code aus. Dann ist es nämlich sehr wahrscheinlich, das das Script vorher verstorben war und den Semaphore nicht gelöscht hat.

Wenn du deinen Timer ausschalten, dann läuft halt nix zum prüfen mehr ;).

Oha, da krampft sich der Magen eines Programmierers aber zusammen.

Gibt es denn keine Try/Ctach oder wenigstens eine If ERR Anweisung oder sowas?

Wenn nicht sollte das unbedingt auf die Wunschliste.

Hi,

denke ich werd bengie´s Ansatz mal verfolgen.

Eben hab ich in der PHP Doku gefunden das FILE_GET_CONTENTS im Fehlerfall
FALSE zurückgibt.

Das müsste doch genutzt werden können um den Scriptabbruch zu verhindern.

Danke für die Hilfe

Gruß Martin

Berichte mal!

Hmmm,

bevor ich meine WebCamBilder per Skript abhole, pinge ich die Kamera kurz an.
Wenn ich sie nicht erreiche, verlasse ich das Skript erstmal wieder (mit entsprechendem Hinweis im WF).

Gruß Tom

So hier mal meine Lösung nach der Umstellung, das ganze sollte nun Fehlertollerant sein.

Sollte ein Kommunikationsfehler auftreten so wird eine Alarmvariable gesetzt um mich zu informieren das was nicht stimmt.

Diese wird aber bei der nächsten erfolgreichen Kommunikation auch wieder zurückgesetzt.

Dem FileGetContents habe ich noch einen Timeout hinzugefügt damit die Laufzeit des Scripts nicht den in der PHP.INI definierten Wert überschreitet.

Der relevante Code:

	
$fehler = false;
$context = stream_context_create(array(
		    'http' => array(
      		  'timeout' => 2      // Timeout in seconds
		    )
			));
	
				while ( $piccount > 0 ) {
  			 	     $daten = file_get_contents('http://user:pass@192.168.1.252/jpg/image.jpg',0,$context);
                 if ( !$daten ) {
						   //Verbindungsfehler oder keine Daten
					   	$fehler = true;
					  } else {
				        $datum = date('Y-m-d-His');
   				     $verbindung = fopen("$pathneu/$datum.jpg", "w");
	   			     fwrite($verbindung, $daten);
   	   			  fclose($verbindung);
						}
					usleep(500);
					$piccount = $piccount - 1;
	
	   		}

				SetValue(59853 /*\Allgemein\Funktionen\Videoueberwachung\Kamera Hinten Fehler]*/ ,$fehler);

Gruss Martin