Raketenwilli: Weitere Möglichkeit, jüngste Datei in einem Verzeichnis zu finden (mit CacheFile)

Beitrag lesen

Auf Shell-Ebene kann man - zumindest unter Windows, eine Auflistung von Dateien sortiert nach Zeit anfordern (dir /O:D-). DAS geht unter Windows fix, unter Linux weiß ich es nicht.

ls -t

Aber ich befürchte, dass die Ausführung von Shell-Befehlen je nach Hoster ebenfalls beschränkt ist.

Man braucht also bei sehr vielen Dateien ggf. eine Alternative zum Cron-Job.

Auf die Schnelle: Wenn eine neue Datei abgelegt wird ändert sich die Filemtime des Verzeichnisses. Die könnte man (in einem ANDEREN Verzeichnis) zusammen mit den Name des jüngsten Files serialisiert als Cache ablegen und dann beim Zugriff prüfen, ggf. die Datei erneuern:

<?php

function getNewestFile ( $dir, $cacheFile=false ) {
    if ( false == $cacheFile ) { 
		$cacheFile =   '/tmp/newestFileCache_'
                 . str_replace( '/', '_', $dir )
                 . '.txt';
	}
	if ( is_readable ( $cacheFile ) ) {
		$arr_cached = unserialize(
            file_get_contents( $cacheFile )
        );
	} else {
		$arr_cached = false;
	}
    $dirmtime = filemtime( $dir ); 
    if ( 
			( !	$arr_cached )
		or  $arr_cached[0] < $dirmtime
	) {
		$maxTsFile = 0;
		$nFileName = "";
		foreach( glob( $dir . '/*.*' ) as $fileName ) {
			$ts = filemtime( $fileName );
			if( $ts > $maxTsFile ) {
				$maxTsFile = $ts;
				$nFileName = $fileName;
			}
		}
		file_put_contents(
        $cacheFile,
        serialize( [ $dirmtime, $nFileName] )
    );
		return $nFileName;
	} else {
		return ( $arr_cached[1] . '( From Cache )' );
	}
}

# Test:
echo getNewestFile( '/home/user/Dokumente' ) . PHP_EOL;

Die mit Abstand beste Alternative ist es natürlich, durch ein Upload-Skript die neueste Datei irgendwo (Datei, Datenbank ) zu registrieren.

Ach ja: Das . '( From Cache )' in der drittletzten Zeile der Funktion dient nur dazu, zu zeigen, dass das geht… Und es fehlt die Fehlerbehandlung - deshalb hab ich (das sonst scheinbar funktionierende) Skript als „schlecht“ markiert.

Das Skript bemerkt (hier, auf ext4-Dateisystem) allerdings nicht, wenn existierenden Dateien verändert werden. Die modification time für Verzeichnisse ändert sich nur beim Löschen, Hinzufügen oder Umbenennen von Dateien in diesen.