filectime()
Die Funktion filectime() gibt die letzte Änderungszeit des Inodes einer Datei als Unix-Timestamp zurück.
Was ist die Funktion filectime()?
Die Funktion filectime() ist eine eingebaute PHP-Funktion, die die Inode-Änderungszeit einer Datei zurückgibt — einen Unix-Timestamp (die Anzahl der Sekunden seit dem 1. Januar 1970), der den Zeitpunkt darstellt, zu dem die Metadaten der Datei zuletzt geändert wurden. „Inode" ist die Datenstruktur, die ein Unix-ähnliches Dateisystem verwendet, um Informationen über eine Datei (ihre Berechtigungen, Eigentümer, Größe und den Speicherort der Datenblöcke) getrennt vom eigentlichen Dateiinhalt zu speichern.
Ein häufiger Irrtum: filectime() gibt nicht den Erstellungszeitpunkt der Datei zurück. Das „c" steht für change (Änderung), nicht für create (Erstellen). Die Inode-Änderungszeit wird aktualisiert, sobald sich die Metadaten der Datei ändern — zum Beispiel wenn Sie chmod oder chown ausführen, die Datei umbenennen oder sogar ihren Inhalt bearbeiten (was ebenfalls die Metadaten aktualisiert). PHP besitzt keine portable Funktion für eine echte Erstellungszeit.
Verwenden Sie die richtige Funktion für Ihren konkreten Bedarf:
filectime()— wann sich der Inode (Metadaten) zuletzt geändert hat (Berechtigungen, Eigentümerschaft, Linkanzahl, Umbenennung).filemtime()— wann der Inhalt der Datei zuletzt geändert wurde.fileatime()— wann die Datei zuletzt aufgerufen (gelesen) wurde.
Hier ist die grundlegende Syntax der Funktion filectime():
Die PHP-Syntax von filectime()
filectime(string $filename): int|falseDabei ist $filename der Pfad der zu prüfenden Datei. Die Funktion gibt die Inode-Änderungszeit als Unix-Timestamp zurück, oder false (mit einem E_WARNING), wenn die Datei nicht existiert oder nicht zugänglich ist. Da false und ein Timestamp bei losen Vergleichen beide „falsy" wirken können (ein Timestamp ist in der Praxis nie 0, aber defensiver Code ist wichtig), sollte das Ergebnis immer mit dem strikten Operator !== false geprüft werden.
Wie verwendet man die Funktion filectime()?
Die Verwendung der Funktion filectime() ist unkompliziert. Folgen Sie diesen Schritten:
- Rufen Sie die Funktion
filectime()auf und übergeben Sie den Namen der zu prüfenden Datei. - Die Funktion gibt einen Unix-Timestamp zurück, der die Inode-Änderungszeit darstellt, oder
falsebei einem Fehler. - Den Unix-Timestamp können Sie mit der Funktion
date()formatieren, um die Zeit in einem besser lesbaren Format anzuzeigen.
Hier ist ein Beispiel-Codeausschnitt, der zeigt, wie die Funktion filectime() verwendet wird:
Wie verwendet man die Funktion filectime()?
<?php
$filename = 'myfile.txt';
$last_change_time = filectime($filename);
if ($last_change_time !== false) {
$change_time_string = date('F d Y H:i:s', $last_change_time);
echo "The file $filename had its inode changed on $change_time_string";
} else {
echo "Could not retrieve inode change time for $filename.";
}Hinweis: Der Parameter filename akzeptiert sowohl relative als auch absolute Pfade. Bei einem relativen Pfad wird dieser relativ zum aktuellen Arbeitsverzeichnis aufgelöst.
In diesem Beispiel prüfen wir die Inode-Änderungszeit von myfile.txt mit der Funktion filectime(). Den zurückgegebenen Unix-Timestamp speichern wir in der Variable $last_change_time. Der Code prüft zunächst, ob die Funktion nicht false zurückgegeben hat, formatiert dann den Timestamp mit date(). Beachten Sie, dass date() die Standard-Zeitzone des Servers verwendet; verwenden Sie date_default_timezone_set(), wenn Sie eine bestimmte Zeitzone benötigen. Abschließend wird eine Meldung ausgegeben, die anzeigt, wann die Metadaten der Datei zuletzt geändert wurden.
Ein eigenständiges, ausführbares Beispiel
Der obige Codeausschnitt setzt voraus, dass eine Datei auf dem Datenträger vorhanden ist. Das folgende Beispiel erstellt eine temporäre Datei, ändert ihre Berechtigungen, um eine Inode-Änderung auszulösen, und liest dann den Timestamp zurück — so können Sie es direkt ausführen und echte Ausgaben sehen:
<?php
// Create a temporary file
$path = tempnam(sys_get_temp_dir(), 'demo');
file_put_contents($path, 'hello');
// Changing permissions updates the inode change time (ctime)
chmod($path, 0644);
$ctime = filectime($path);
echo "ctime: " . date('Y-m-d H:i:s', $ctime) . PHP_EOL;
echo "Is it a Unix timestamp (integer)? " . (is_int($ctime) ? 'yes' : 'no') . PHP_EOL;
unlink($path); // clean upDies gibt die formatierte Änderungszeit gefolgt von Is it a Unix timestamp (integer)? yes aus und bestätigt damit, dass filectime() einen Integer-Timestamp zurückgibt.
Achtung: Stat-Caching
PHP speichert die Ergebnisse von Dateisystem-Stat-Funktionen wie filectime(), filemtime() und fileperms() für die Dauer einer einzelnen Anfrage im Cache, um die Performance zu verbessern. Wenn Sie eine Datei ändern und filectime() anschließend in demselben Skript erneut aufrufen, erhalten Sie möglicherweise den veralteten, gecachten Wert. Rufen Sie zuerst clearstatcache() auf, um einen aktuellen Wert zu erhalten:
<?php
$path = tempnam(sys_get_temp_dir(), 'demo');
$first = filectime($path);
sleep(1);
chmod($path, 0600); // changes the inode
clearstatcache(); // discard the cached stat result
$second = filectime($path);
echo ($second >= $first) ? "ctime updated\n" : "still cached\n";
unlink($path);Dies gibt ctime updated aus. Entfernen Sie die Zeile clearstatcache(), kann PHP stattdessen den alten Wert ausgeben.
Fazit
Die Funktion filectime() ist ein nützliches Werkzeug in PHP, um zu prüfen, wann der Inode (die Metadaten) einer Datei zuletzt geändert wurde — Berechtigungen, Eigentümerschaft oder eine Umbenennung. Denken Sie daran, dass es trotz des „c" keine Funktion für den Erstellungszeitpunkt ist: Verwenden Sie filemtime(), wenn Sie die Zeit der letzten Inhaltsänderung benötigen, fileatime() für die letzte Zugriffszeit, und rufen Sie clearstatcache() auf, wenn Sie innerhalb derselben Anfrage garantiert aktuelle Werte benötigen. Kombinieren Sie sie mit file_exists(), um Warnungen bei nicht vorhandenen Dateien zu vermeiden.