PHP скрипт для удаления тысяч изображений.jpg?
Мой слабый общий веб-хостинг не поддерживает cron или perl, и мне часто приходится удалять тысячи изображений.jpg из определенных папок. Изображения загружены с веб-камер. Мне интересно, есть ли простое приложение, которое может рекурсивно найти все изображения.jpg и удалить их.
Мне нужно настроить таргетинг только на изображения в следующем формате даты: 2011-10-19_00-29-06.jpg ... и только на изображения старше 48 часов.
Apache 2.2.20 DirectAdmin 1.39.2 MySQL 5.1.57 Php 5.2.17
4 ответа
@user427687, ты имеешь ввиду весь формат картинки 2011***.jpg
? если так, возможно, мой код будет работать.
<?php
$path = dirname(__FILE__).'/filepath';
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ((time()-filectime($path.'/'.$file)) < 86400*2) {
if (preg_match('/\2011(.*?).jpg$/i', $file)) {
unlink($path.'/'.$file);
}
if (preg_match('/\2011(.*?).jpeg$/i', $file)) {
unlink($path.'/'.$file);
}
}
}
}
?>
Простая наивная версия:
$yesterday = date('Y-m-d', strtotime('yesterday')); // 2011-10-17
$day_before = date('Y-m-d', strtotime('2 days ago')); // 2011-10-16
$images = glob('*.jpg');
foreach($images as $img) {
if (strpos($img, $yesterday) === 0) || (strpos($img, $day_before) === 0)) {
continue;
}
unlink($img);
}
При этом будут удалены все файлы с отметкой даты от 3 дней и старше, проверяя, имеет ли файл отметку даты вчера или позавчера. Но он также удалит все файлы, созданные сегодня.
Лучшая версия будет:
$images = glob("*.jpg");
foreach ($images as $img) {
$ctime = filectime($img);
if ($ctime < (time() - 86400 * 2)) {
unlink($img);
}
}
Эта версия проверяет фактическое время последнего изменения файла и удаляет все, что старше 48 часов. Однако это будет медленнее, так как вызов stat(), выполняемый filectime(), будет недешевым вызовом.
Примерно так должно начаться:
class MyRecursiveFilterIterator extends RecursiveFilterIterator {
const EXT = '.jpg';
public function accept() {
// code that checks the extension and the modified date
return $this->current()->getFilename() ...
}
}
$dirItr = new RecursiveDirectoryIterator('/sample/path');
$filterItr = new MyRecursiveFilterIterator($dirItr);
$itr = new RecursiveIteratorIterator($filterItr, RecursiveIteratorIterator::SELF_FIRST);
// to iterate the list
foreach ($itr as $filePath => $fileInfo) {
echo $fileInfo->getFilename() . PHP_EOL;
}
Или только с php:
<?php
$last_2_days_in_seconds = 3600 * 48;
foreach (glob("*.jpg") as $filename) {
if((time() - fileatime($filename)) > $last_2_days_in_seconds && preg_match('/^2011/', $filename)) unlink($filename);
}
?>