PHP Skript Ordnerüberwachung fehlerhaft (bitte Helfen)

  • Ersteller PowerShellAdmin
  • Erstellt am
P

PowerShellAdmin

Guest
Hi zusammen,

ich habe ein kleines PHP Tool geschrieben das in einem Ordner die Dateien durchzählt im 5min Takt.
Sobald ein Fehler auftritt wird ein Fehlercounter +1 gesetzt.

Ab den Wert 5 sollte es auslösen, sobald es einmal wieder erfolgreich mehr Dateienzählt wird der Counter auf 0 gesetzt, das Tool funktioniert auch immer im kurz Test.

Nur ca. alle 4-6 Wochen wird eine Fehlinitiallisierung ausgelöst und die Folge Routine läuft durch... Mein Chef findet den Fehlalarm natürlich nicht lustig.

Ich habe hier mal einen PHP Auszug nur von der Zählung eingefügt, gegenenfalls gibts ja durch die hohe Anzahl an Durchläufe einen Schleifenabsturtz ? (alle 5min wird diese ausgeführt).



Vor dem Code werden die Variablen konfiguriert und im Anschluss die funktionierende eMailroutine ausgelöst.

PHP:
/*Dateianzahlmodul*/



$countold=0; /*Damit der Skript bei dem Programmstart keinen Fehler erzeugt*/
$error=0;

    /*Dateizählung*/
do{

sleep($time); /*Pause wird eingeleitet*/

    $i=0; /*Wichtig, um die Dateien zählen zu können.*/

    $handle = opendir($path);
    while ($file = readdir ($handle)) {
        if($file != "." && $file != "..") {
          if(!is_dir($path."/".$file)) {
           $i++;
           $compl = $path."/".$file;
           
       					 }
    					}
					}

echo "Ordner enthaelt".$i."Dateien\n";






closedir($handle);
$countnew=$i; /*Zählung wird auf Vergleichsvariable gesetzt*/
 
 
  if($countnew > $countold) /* Überprüfung auf Veränderung */
      
    {
    $error=0;
    
    }    
   else
   {
   $error++;
   };
   $countold=$countnew;
  

}while($error < $ercounter);
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Lässt du das Ding tatsächlich wochenlang in einer Schleife laufen?
Wieso rufst du es nicht alle paar Minuten per Cronjob auf?
 
Lässt du das Ding tatsächlich wochenlang in einer Schleife laufen?
Wieso rufst du es nicht alle paar Minuten per Cronjob auf?

Ja, habe leider nicht soviel Zeit und arbeitstechnisch überläuft sich eins meistens nach dem andern. Hatte das vor meinen Abschlussprüfungen erstellt und dann keine Zeit mehr gehabt.

Cronjob habe ich schonmal gehört, sagt mir aber nicht soviel. Bin in PHP noch ein Einsteiger und hatte leider nie so die Zeit das mich dadrin zu vertiefen.

Also ist davon auszugehen das die Schleife irgendwann Programmtechnisch abstürtzt ?
 
Läuft das ganze denn auf einem Linux-Server?
Dann kannst du das Script eben automatisch per Cronjob alle 5 Minuten starten lassen und sparst dir damit die Schleife und solltest keine Probleme mit Timeouts oder abbrechenden Schleifen mehr haben.
 
Läuft das ganze denn auf einem Linux-Server?
Dann kannst du das Script eben automatisch per Cronjob alle 5 Minuten starten lassen und sparst dir damit die Schleife und solltest keine Probleme mit Timeouts oder abbrechenden Schleifen mehr haben.

Das ganze läuft auf einem Win2003 Server. Das Tool überprüft ein Verzechnis auf dem Server.

Das Verzeichnis enthält eingehende eMails. Jede eMail besteht aus 2 Dateien. Die eMails kommen also alle 15Min.

Da die Schleife recht simple ist und ja auch nur alle 5Min durchläuft dachte ich das geht relativ unproblematisch.

Treffen die Dateien nicht ein wird der Fehlercounter hochgestellt, nach dem 5mal wird die eMail Routine initialisiert.... Diese löst dann weiter über den Mailsrv Anruf, SMS etc aus.




Gibt es da eine bessere Möglichkeit ?

Dachte schon dadran über WinTask das Tool jede Woche 1mal neu zustarten.
 
Zuletzt bearbeitet:
Hmm. Ich nehme an, Wintask ist sowas wie cronjob.
Ich bin da eher der Linuxmensch :fresse:
Konsequenter wäre es da doch, die Schleife ganz wegzulassen und es einfach alle 5 Minuten zu starten?
Aber wenn die Schleife alle 5 Minuten läuft, ist es doch relativ klar, dass der Fehler um eins hochgezählt wird, wenn noch keine neue Mail da ist, da dann countnew und countold doch noch gleich sind?

Edit: wenn doch eine kommt, wird er ja wieder auf 0 gestellt :fresse:
 
Hmm. Ich nehme an, Wintask ist sowas wie cronjob.
Ich bin da eher der Linuxmensch :fresse:
Konsequenter wäre es da doch, die Schleife ganz wegzulassen und es einfach alle 5 Minuten zu starten?
Aber wenn die Schleife alle 5 Minuten läuft, ist es doch relativ klar, dass der Fehler um eins hochgezählt wird, wenn noch keine neue Mail da ist, da dann countnew und countold doch noch gleich sind?

Edit: wenn doch eine kommt, wird er ja wieder auf 0 gestellt :fresse:

Die eMails kommen alle 5-15Min. Daher arbeite ich ja auch mit einer relativ kleinen Zeit und einen Counter.

Habe mir überlegt in die Schleife einen zusätzlichen Counter zumachen, dieser springt z.B. nach 40 Durchläufen an den Programmstart.
Damit habe ich noch genügent Sensibilität und das Problem mit den Schleifen wäre gelöst, da es komplett neu initialisiert wird.

Geht das bei PHP überhaupt ?
 
du kannst eine Schleife per break unterbrechen.
Vielleicht klappt es ja, wenn du die Schleife in eine Funktion packst, die sich nach beenden der Schleife selbst wieder aufruft :fresse:

Edit: Ich bin auch bloß ein PHP-Pfuscher, habe bis jetzt aber eigentlich alles zum Laufen gebracht.xD

Edit2: aber selbst wenn es funktionieren würde, würde ich kein PHP-Script mehrere Wochen am Stück laufen lassen.
 
Zuletzt bearbeitet:
unter windows einfach einen "geplanten task" einrichten. besser als der endlosschleifen mist.
 
unter windows einfach einen "geplanten task" einrichten. besser als der endlosschleifen mist.

Joa denke ich auch. Lass ich das Tool 2mal die Woche neustarten und dann habe ich keine Probleme mit dem Verfahren oder ist das Zeitfenster immernoch zu groß ?

Sry -.-<<Sysintegrator... Programmierfuscher :-D
 
Nimm die Schleife ganz raus und starte es einfach alle 5 min.

Wiebitte, das gibt Realisierungsprobleme. Dann muss ich das ganze noch um eine Logerweitern, da er ansonsten die Zählungenverwirft.

Das heißt ich müsste das ganze in eine Dateischreiben das er sich dort immer die letzten Daten raussucht, ansonsten würde das nicht funktionieren.

Oder ich ändere die Logik der Abfrage ab.... Folgende Abfrage ist wohl nicht gerade einfach:

Ordnerdurchsuchen und vergleichen ob 2 Dateien Max 40Min vor der jetzigen Zeit erstellt wurden...

Aber keine Ahnung wie ich das mache, wobei das die nahezu perfekte Lösung wäre.
 
Kann denn dein WinTask das nicht alle 5 Minuten starten?
Ansonsten ist es nicht sehr schwer, in eine Textdatei zu schreiben und die zu lesen.
Oder du machst es per MySQL-Datenbank :fresse:
 
Hab den Text jetzt nur kurz überflogen, würde dir aber auch dazu raten es mit Cronjob/Taskplaner zu machen.

Mit dem Windows Taskplaner kann man definitiv Minutenabstände definieren.
 
Zuletzt bearbeitet:
Kann denn dein WinTask das nicht alle 5 Minuten starten?
Ansonsten ist es nicht sehr schwer, in eine Textdatei zu schreiben und die zu lesen.
Oder du machst es per MySQL-Datenbank :fresse:

Naja mysql wäre garkein Problem, nur macht meiner Meinung kein Sinn... kostet viele Ressourcen und würde unsern Zentralserver nur unnötig belasten.

Dateischreiben habe ich ewig nicht mehr gemacht :) liegt fast nen Jahr zurück mit SQL etc. Aber glaube über ne Logdatei wäre es eine gute Lösung oder alternativ mit der speziellen Abfrage.
 
Nein. Da das Script ja nicht vom Browser aufgerufen wird und daher auch keinen HTML- oder Javasctipt-Code enthält.

Zum Thema MySQL: Das sollte den Server nicht allzu sehr belasten, wenn es dir aber um die Effizienz deines Codes geht, solltest du sowieso eher keine interpretierte Sprache verwenden.
 
nen Cookie wäre was feines :d oder ich mache es direkt als kleine Webaplikkation ...

Geht leider nicht, da dass ganze als Dienst läuft.

Mit der Datenbank klingt schon ganz gut, nur wäre das schon ein kompletter "Overpower" für das Ganze.

....

Zum Thema Performance, PHP sollte deutl. besser als zum Bsp. VB laufen. Wobei ich in VB mich nur Ansatzweise mit befasst habe.

Aber was spricht gegen folgende Abfrage:

Durchsuche Ordner, wenn keine Datei jünger als 40min ist .... alarmiere.


Der Ordner muss überprüft werden auf die Dateien und die Information des Erstellungsdatums müssten ausgelesen werden.
 
Zuletzt bearbeitet:
Du könntest das Script natürlich gleich auf dem Mailserver laufen lassen, wenn er eine Mail verschickt :fresse:
 
Du könntest das Script natürlich gleich auf dem Mailserver laufen lassen, wenn er eine Mail verschickt :fresse:

Der Skript läuft direkt auf dem Server (Mailserver) und ja er verschickt auch im Anschluss beim Fehler über den lokalen SMTP dann die eMails. Das funktioniert ja auch alles prima.

@kasn :) muss ich mir mal anschauen, sagen mir nicht soviel und ... wenn man nur 2mal im Jahr mit sowas arbeitet ist das ... leider alles recht umständlich.
Hinzugefügter Post:
so habe jetzt mal was versucht (im arbeitstobabowa mal kurz reingeschoben und nicht getestet)
Log Datei wird mit Schreibrechten geöffnet.
Die ersten 10 Stellen werden in die Var eingelesen
Anschließend kommt die Zählung und vergleicht die 1. 10 Stellen in der Log mit den neuem Wert.

Dann wird der neue Wert durch Rewind in die oberste Zeile geschrieben.

Jedenfalls gehe ich davon aus :)

PHP:
/*Dateilesen */
$datei = fopen("offco001.log","r+");
$counterold = fgets($datei, 10);
if($counterold == "")
    {
    $counterold = 0;
    }
/* Daten wurden in var $counterold eingelesen*/	
	
    $i=0; /*Wichtig, um die Dateien zählen zu können.*/

    $handle = opendir($path);
    while ($file = readdir ($handle)) {
        if($file != "." && $file != "..") {
          if(!is_dir($path."/".$file)) {
           $i++;
           $compl = $path."/".$file;
           
       					 }
    					}
					}

echo "Ordner enthaelt".$i."Dateien\n";






closedir($handle);
$countnew=$i; /*Zählung wird auf Vergleichsvariable gesetzt*/
 
 
  if($countnew > $countold) /* Überprüfung auf Veränderung */
      
    {
    $error=0;
    
    }    
   else
   {
   $error++;
   };
   $countold=$countnew;
  
  /* Dateibeschreiben*/
/*Dateipoint springt an oberste Zeile */
  rewind($datei);
/*in die Datei wird der neue Wert eingelesen in die oberste Zeile */
  fwrite($datei, $counterold);
 /*LogDatei wird wieder freigegeben */
  fclose($datei);

edit: Für den Fehlercounter könnte ich ja noch ein logdatei ebenso erstellen.
 
Zuletzt bearbeitet:
so habe mal php code gebastelt.

die neue dateianzahl wird an die logdatei mit a angefügt.

die datei wird mit lines in ein zeilen array geladen und die letzte zeile wieder an eine variable übergeben.

wenn ich das anpasse kann ich da dann den fehlercounter etc integrieren.

PHP:
/*** IN LETZTE ZEILE EINTRAG DER LOG ERGÄNZEN ****/
$datei = fopen ("offco001.log", "a");

$oldcount="\r\n"."$oldcount nachher";
fwrite($datei, "$oldcount");
fclose($datei);

/***** AUSGABE DER LETZTEN ZEILE******/
/* läd datei Zeilenweise in eine Array*/
$lines = file ('offco001.log');

/*Ausgabe der  letzten Zeile aus dem Array*/
$letzte_zeile= array_pop($lines);
echo $oldcount;

muss das ganze natürlich dann noch anpassen in den neuen code :)

mfg
 
Abend,
ich misch mich jetzt hier auch einfach mal ein, trotz der Gefahr, nach 2 Bier einen Denkfehler reingebracht zu haben, aber:

Durchsuche Ordner, wenn keine Datei jünger als 40min ist .... alarmiere.

Machs doch dann einfach etwa so, wie du es selbst schon vorschlägst...

PHP:
<?php
$handle = opendir($path);
while ($file = readdir ($handle)) {
	if($file != "." && $file != "..") {
		if(!is_dir($path."/".$file)) {
			$i++;
			$compl = $path."/".$file;			
			if(filemtime($compl) < strtotime("-40 minutes")){
				echo $compl." zu alt (".date("Y.m.d. H:i:s", filemtime($compl)).") <br/>";			
			}
		}
	}
}
?>

So listet die Schleife alle Files auf, die älter als 40 min sind...
Falls du die Files benötigst die jünger sind, dreh einfach das "<" um^^
greets
 
Abend,
ich misch mich jetzt hier auch einfach mal ein, trotz der Gefahr, nach 2 Bier einen Denkfehler reingebracht zu haben, aber:



Machs doch dann einfach etwa so, wie du es selbst schon vorschlägst...

PHP:
<?php
$handle = opendir($path);
while ($file = readdir ($handle)) {
	if($file != "." && $file != "..") {
		if(!is_dir($path."/".$file)) {
			$i++;
			$compl = $path."/".$file;			
			if(filemtime($compl) < strtotime("-40 minutes")){
				echo $compl." zu alt (".date("Y.m.d. H:i:s", filemtime($compl)).") <br/>";			
			}
		}
	}
}
?>

So listet die Schleife alle Files auf, die älter als 40 min sind...
Falls du die Files benötigst die jünger sind, dreh einfach das "<" um^^
greets

hey :) sry für die späte rückmeldung. hatte etwas urlaub.

vielen dank für deinen post, dass hilft mir gleich viel viel weiter !

werde das ganze im 30min rhytmus 1mal ausführen über einen task (oder gibts da besseres).


ich setze im code den fehlerstatus true (1).
die durchzählung läuft dann nach deinem schehma durch. findet er eine datei der jünger als 40min ist (also die emails gehen erfolgreich ein) setzt er einfach den fehlerstatus auf false (0).

habe das mal eben eingefügt:

PHP:
<?php
$path="c:/neu";  /* Pfad des zu Überwachenden Ordners*/
$fehler=1; /*Fehlerstatus ist aktiviert */

/*Durchzählung aller Dateien innerhalb des Ordners*/
$handle = opendir($path);
while ($file = readdir ($handle)) {
    if($file != "." && $file != "..") {
        if(!is_dir($path."/".$file)) {
            $i++;
            $compl = $path."/".$file;            
            if(filemtime($compl) < strtotime("-30 minutes")){
                echo $compl." zu alt (".date("Y.m.d. H:i:s", filemtime($compl)).") <br/>";            
            
/* bei Fund einer aktuellen Datei wird der fehlerstatus deaktiviert*/
$fehler=0;
            }
        }
    }
}

/*Abfrage des Fehlerstatus, falls keine Datei <30Min $FehleR=1*/
if $fehler=1 

{
/*Auslösen der Benachrichtigung*/

email versand

}


?>

EDIT:
Der Taskplaner ist wohl nicht die eleganteste Methode. Hier müsste ich ja 00:00, 00:30;01:00,01:30...n...23:30 einen Task erstellen :)

47 Tasks sind dann doch nicht so übersichtlich .....
 
Zuletzt bearbeitet:
Doch der Taskplaner funktioniert schon.

Du musst nur einen geplanten Task erstellen, und wenn er fertig ist, musst
du auf den Reiter "Zeitplan" dann unter [Erweitert...] kannst du ihn alle
30 Minuten starten lassen... siehe Screenshot im Anhang
 

Anhänge

  • taskplaner.JPG
    taskplaner.JPG
    20,1 KB · Aufrufe: 29
Doch der Taskplaner funktioniert schon.

Du musst nur einen geplanten Task erstellen, und wenn er fertig ist, musst
du auf den Reiter "Zeitplan" dann unter [Erweitert...] kannst du ihn alle
30 Minuten starten lassen... siehe Screenshot im Anhang

Schande über mein Haupt :) thx.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh