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

Ereignis nach vorgegebener Zeit (z.B. 48 Stunden) auslösen

schlegel.berlin

New member
Hallo Ihr Lieben,

ich habe wieder einmal eine Problemstellung, für die ich nicht wirklich eine Lösung finde.

Ich lege bei einem bestimmten Ereignis ein temporäres Verzeichnis an, in das ich eine Datei schreibe.
Nach einem vorbestimmten Zeitablauf (z.B. nach 48 Stunden) möchte ich das komplette Verzeichnis nebst darin befindlicher Datei löschen.
Das Löschen selbst stellt ja kein Problem dar.
Wie aber schaffe ich das zeitverzögert, relativ zur Zeit des Anlegens des betreffenden Verzeichnisses.

Hat jemand von Euch einen Denkanstoss für mich? Kennt irgendjamans eine Klasse, die das vermag zu tun?

Liebe Grüße und vielen Dank im Voraus, Karin
 
Danke, "ein schlauer",

an "Cron-Job" habe ich auch schon gedacht. Mit einem "Cron-Job" erreiche ich mein Ziel aber nicht wirklich, da, nach meinem Verständnis, ein "Cron-Job" nicht von einem Ereignis aus aktiviert werden kann (mit entsprechender Zeitverzögerung), sondern zu bestimmten (realen) Zeiten, bzw. zu einem bestimmtem Zeitpunkt ausgeführt wird (vorbestimmter Tag, vorbestimmte Uhrzeit, vorgegebener Zeitintervall), der unabhängig vom Eintreten eines stattgefundenen Ereignisses durchgeführt wird (z.B. dem Generieren eines Verzeichnisses oder einer Datei).

Wie also soll möglich sein, dass der "Cron-Job" z.B. 48 Std. NACH anlegen eines Verzeichnisse ausgeführt wird? Auf diese Problemstellung finde ich keine Anwort, bzw. habe ich noch keine gefunden ...

Liebe Grüße, Karin
 
Wie wird denn das Verzeichnis angelegt?

EDIT: Ach steht ja in deiner ersten Frage. Was spricht dagegen bei dem "bestimmten" Ereignis den Cronjob anzulegen?
 
Wenn ich wüsste wie das geht, würde ich es machen.
Meine Grundidee wäre, bei entreten des Ereignisses einen Cronjob anzulegen, der nur 1 x ausgeführt wird. Bin aber nicht so "ganz in der Spur", das richtig zu machen.
Ein kleine Hilfe wäre super (grundsätzlich weiß ich schon, wie man Cronjobs anlegt ....

Grüße, Karin
 
wie siehts aus, dass wenn du bei der erstellung den timestamp abspeicherst. und ein cron-job führt zb alle 15min ein skript aus, dass prüft ob der timestamp 48h her ist, wenn ja dann wird was gemacht ;)
 
Karin, in welcher Sprache läuft denn das Serverscript? Es sollte eigentlich für jede Serversprache ein Modul geben mit dem man einfach CRON's verwaltet.
Variante A:
Script legt Verzeichnis an, errechnet das reale Datum+Uhrzeit in 48 Stunden, trägt CRON ein, beendet.
Cron startet anderes Serverscript, das löscht das Verzeichnis und auch seinen Starteintrag in der CRON-Tab.
Problem: Wie nah können die Zeitpunkte beeinander liegen? Man müsste ggf. einen ID an den Aufruf in der CRON-Tab hängen, damit der Aufruf eindeutig identifiziert werden kann.

Variante B:
Oder du läßt das Serverscript als Dämon laufen, der 48 Stunden "pausiert". Müsste man mal checken, ob das in der von dir verwendeten Serverscriptsprache sauber möglich ist ohne zuviel CPU und Laufzeit zu beanspruchen. Manche Provider killen auch Scripte nach X Sekunden.
Problem: Dafür muss aber sichergestellt sein, dass der Server nicht z.B. für Datensicherung runtergefahren wird.
 
Zuletzt bearbeitet:
Hi,
ich vermute mal, du möchtest nach einer gewissen Zeit einfach aufräumen und bestimmte Dateien + Verzeichnisse, die nicht mehr gebraucht werden, löschen.
Wenn du cron verfügbar hast, geht das ganz einfach. Du lässt zyklisch (z.B. täglich) dein Aufräumscript starten.
Dieses schaut nach, wann die Dateien das letzte mal modifiziert wurden , z.B. mit filemtime. Wenn die Datei älter als die gewünschte Lebensdauer ist, wir sie gelöscht und wenn ein Verzeichnis leer ist dieses dann auch. So mach ich es immer.
Das Aufräumscript nutze ich gleichzeitig um z.B. log-Dateien aufzuräumen oder bestimmte Sachen zu zippen.


LG jspit
 
Mein Gott, so viel Hilfe.
Erst mal Danke an Euch alle.

Ich werde es wahrscheinlich so machen wie "TecEye" vorschlug (in Verbindung mit einer ID).

Eine echt gute Idee. Manchmal ist die Lösung doch einfacher als gedacht. Ich hab viel zu kompliziert um die Ecke gedacht. Blöd von mir...
Also, genau so werde ich es machen.

Danke für die vielen "Drauf-Lupfer" ... :icon7:
 
Zuletzt bearbeitet:
So, Ihr Guten,

erst nochmal vielen Dank für Eure echt hilfreichen Denkanstöße.

Nun habe ich mich also voller Tatendrang an die Lösung des Aufgabenstellung gemacht.

Das nachstehende Script wird per Cronjob 1 x täglich aufgerufen, um die Unterverzeichnisse im Ordner "rep_order" mit Erstellungsdatum aufzulisten, sie beim Durchlaufen der while-Schleife mit dem aktuellen Datum zu vergleichen und wenn älter als 2 Tage nebst Inhalt zu löschen:

PHP:
$today = date("d.m.Y");
$handle=opendir ("rep_order");

while ($datei = readdir ($handle)) 
{
if($datei != ".." && $datei != ".")
{
	$dirdate = date("d.m.Y",filemtime(rep_order."/". $datei)); 
	
	function seDay($begin,$end,$format,$sep)
	{ 
	$pos1 = strpos($format, 'd'); 
	$pos2 = strpos($format, 'm'); 
	$pos3 = strpos($format, 'Y'); 

	$begin = explode($sep,$begin); 
	$end = explode($sep,$end); 

	$first = GregorianToJD($end[$pos2],$end[$pos1],$end[$pos3]); 
	$second = GregorianToJD($begin[$pos2],$begin[$pos1],$begin[$pos3]); 

	if($first > $second) 
	return $first - $second; 
	else 
	return $second - $first; 
	}
	$timeA = $dirdate;
	$timeB = $today;
	$past_time = seDay($timeA,$timeB,"dmY","."); 

    // Ausgabe der gefundenen Verzeichnisse nebst Erstellungsdatum zu Testzwecken
	echo $datei.' / Das Verzeichnis ist '.$past_time.' Tag(e) alt<br><br>';  

	// hier wird später das Verzeichnis nebst Inhalt gelöscht, wenn es älter als 2 Tage ist

}
}
closedir($handle);

Das funktioniert prinzipiell auch so wie gewünscht.

Das Ergebnis des Scriptes sieht z.B. so aus:
Code:
testordner1 / Das Verzeichnis ist 1 Tag(e) alt

Allerdings funktionert das Ganze nur, solange sich nur 1 Verzechnis in dem Ordner "rep_order" befindet.

befindet sich mehr als 1 Verzeichnis in dem Ordner "rep_order", bekomme ich folgende Fehlermeldung:
Code:
testordner1 / Das Verzeichnis ist 1 Tag(e) alt

Fatal error: Cannot redeclare seday() (previously declared in D: ... Pfad... :12) in D: ... Pfad ... on line 12

Was ich jetzt nicht verstehe ist, weshalb
Code:
function seDay($begin,$end,$format,$sep)
nicht erneut aufgerufen werden kann, wenn die Funktion beim ersten Durchlaufen der while-Schleife bereits einmal aufgerufen wurde.

Hilfe, wo seh ich da den richtigen Baum im Wald wuieder mal nicht?

Liebe Grüße, Karin
 
Wenn ich das richtig sehe wird $dirdate falsch verwendet. Das müsste das Datum des Verzeichnisses enthalten und somit viel früher für die if Abfrage herangezogen werden, wird es aber nicht.
 
Wenn ich das richtig sehe wird $dirdate falsch verwendet. Das müsste das Datum des Verzeichnisses enthalten und somit viel früher für die if Abfrage herangezogen werden, wird es aber nicht.

Danke für den Hinweis, aber das ist NICHT das Problem.
Die Sache mit dem Erstellungsdatum des Verzeichnisses ($dirdate) und dessen Vergleich mit dem aktuellen Datum ($today) funktioniert ja problemlos, so wie gewollt und mit dem beabsichtigten Ergebnis.
Es wird nämlich, richtigerweise, immer das Erstellungsdatum desjenigen Verzeichnisses ermittelt, das in der while-Schleife gerade "ermittelt" wird und dieses dann mit dem aktuellen Datum verglichen.

Es ist eben nur so, wie bereits geschildert, dass dasScript insgesamt NUR funktioniert, solange NUR 1 Unterverzeichnis in dem auzulesenden Verzeichnis (rep_order) befindet...

Noch ein Hinweis:
In dem auszulesenden Verzeichnis (rep_order) befinden sich NUR Unterverzeichnisse (jeweils 1 Datei enthaltend). Dateien egal welcher Datei-Endung befinden sich NICHT im Verzeichnis "rep_order"....
 
Zuletzt bearbeitet:
Hi,
sorry, aber viel zu kompliziert.
1. glob um die Verzeichnisse zu ermitteln
2. Zeitvergleich auf Basis des timestamps anstelle wilder Vergleiche

PHP:
$today = time();
$dirs = glob("rep_order/*",GLOB_ONLYDIR);
foreach($dirs as $dir) {
  $days = (int)(($today-filemtime($dir))/(24*60*60));
  echo $dir.' ist '.$days.' Tage alt<br>';
}

Auf den Pfad in glob nochmal drüberschauen.


LG jspit
 
Hi jspit,

das hat echt geholfen. Viel kompakter, kürzer und wirklich einfach. Wie man sieht: Ich lerne noch ...

Genau deshalb wäre es tierisch nett, wenn ihr mir erklärt, weshalb "mein" um 11.27 Uhr von mir gepostetes Script nur funktiniert, wenn nur EIN subolder im relevanten Verzeichnis (rep_order) liegt.

Liebe Grüße und nochmals Danke an ALLE, Karin
 
Hi,
hab mir dein Fehler mal angesehen:
Code:
Fatal error: Cannot redeclare seday() (previously declared in D: ... Pfad... :12) in D: ... Pfad ... on line 12

sagt doch schon alles: du hast eine functionsdeclaration in einer while-schleife!

also: functionen an den Anfang, dann den weiteren code.
PHP:
 :
  /*
  *  funktionsbeschreibung
  */
    function seDay($begin,$end,$format,$sep)
    { 

    }
  /*
  *  
  */
  $today = ..

Hier noch ein link für eine gute Notation :
PHP Coding Standard - Regeln und Empfehlungen

Da sollte man öfters mal reinsehen (Gilt auch noch für mich) :d
 
Danke, da hat sich gleich wieder was "gelichtet" ...

Und - ich werde Deinen Rat, "da" öfter mal reinzuschauen, beherzigen. Versprochen ....

Habe übrigens Dein Script noch um die Löschfunktion (rekursiv) der relevanten Verzeichnisse nebst Dateien erweitert
und es laäuft alles wie gewünscht ....

Viele Dank nochmal und liebe Grüße
 
Zurück
Oben