Filemtime "не удалось выполнить"
Я уже прочитал столько вопросов и ответов об этом, но я не могу решить свою проблему...
Я пытаюсь создать функцию, которая удаляет все файлы с расширением "xml" или "xsl", которое было создано один день назад. Но я получаю это предупреждение в каждом файле, который у меня есть:
Предупреждение: filemtime() [function.filemtime]: stat failed для post_1003463425.xml в /home/u 188867248/public_html/ampc/library.php в строке 44
Все файлы этого каталога имеют одно и то же имя структуры "post_ + randomNum +.xml" (пример: post_1003463425.xml или post_1456463425.xsl). Поэтому я думаю, что это не закодированная проблема (как я видел в других вопросах).
Код моей функции таков:
function deleteOldFiles(){
if ($handle = opendir('./xml')) {
while (false !== ($file = readdir($handle))) {
if(preg_match("/^.*\.(xml|xsl)$/i", $file)){
$filelastmodified = filemtime($file);
if ( (time()-$filelastmodified ) > 24*3600){
unlink($file);
}
}
}
closedir($handle);
}
}
Спасибо за вашу помощь:)
Ответы
Ответ 1
Я думаю, что проблема - это реальная траектория файла. Например, ваш script работает над './', ваш файл находится внутри каталога './xml'. Поэтому лучше проверьте, существует ли файл или нет, прежде чем вы получите filemtime или отмените его:
function deleteOldFiles(){
if ($handle = opendir('./xml')) {
while (false !== ($file = readdir($handle))) {
if(preg_match("/^.*\.(xml|xsl)$/i", $file)){
$fpath = 'xml/'.$file;
if (file_exists($fpath)) {
$filelastmodified = filemtime($fpath);
if ( (time() - $filelastmodified ) > 24*3600){
unlink($fpath);
}
}
}
}
closedir($handle);
}
}
Ответ 2
Для меня имя файла было добавлено с помощью строки запроса, которая не понравилась этой функции.
$path = 'path/to/my/file.js?v=2'
Решением было сначала отрубить это:
$path = preg_replace('/\?v=[\d]+$/', '', $path);
$fileTime = filemtime($path);
Ответ 3
Укороченная версия для тех, кто любит короткий код:
// usage: deleteOldFiles("./xml", "xml,xsl", 24 * 3600)
function deleteOldFiles($dir, $patterns = "*", int $timeout = 3600) {
// $dir is directory, $patterns is file types e.g. "txt,xls", $timeout is max age
foreach (glob($dir."/*"."{{$patterns}}",GLOB_BRACE) as $f) {
if (is_writable($f) && filemtime($f) < (time() - $timeout))
unlink($f);
}
}