x__miller_x
@x__miller_x

Как рекурсивно удалить файлы и папки с веб-сервера?

Доброго дня!

Есть следующая проблема: на сайте не очищается кэш, из-за чего приходится каждый раз после внесения изменений в шаблоне и изменении картинок лезть на сервер и вычищать папки с кэшами.

Задумался о том, чтобы в крон поместить скриптик, кой нашел в интернете:
<?php
function rrmdir($dir) {
   if (is_dir($dir)) {
     $objects = scandir($dir);
     foreach ($objects as $object) {
       if ($object != "." && $object != "..") {
         if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
       }
     }
     reset($objects);
     rmdir($dir);
	 echo "$dir done<br>";
   }
   else {
	   echo "err";
   }
 }

$dir = dirname(__FILE__) . '/openwargame/superdir';
rrmdir($dir);
mkdir ("openwargame/superdir", 0755);
echo "$dir created";
?>


изначальная проблема в том, что без костыля mkdir ("openwargame/superdir", 0755);
он удаляет и папку "superdir".

Вопрос в том, как сделать так, чтобы удалялось только все содержимое папки "superdir"?
  • Вопрос задан
  • 288 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
RecursiveIteratorIterator + RecursiveDirectoryIterator

$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
    RecursiveIteratorIterator::CHILD_FIRST
);

foreach ($files as $fileinfo) {
    $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
    $todo($fileinfo->getRealPath());
}

rmdir($dir);
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
А чем ваш костыль плох, ну кроме того что он зачем то все объекты обходит? Может я чего не понимаю?
Грохнул папку - создал заново, сильно шустрее чем рекурсивно все обходить по 1 объекту, если в кеше у вас 10 000 объектов, то это может затянуться на некоторое время, а так - чик, и по самые гланды.
Ответ написан
alsopub
@alsopub
Тут уже много чего присоветовали, все по делу.
От себя добавлю следующее.
1) Опция "--preserve-root" для rm, так, на всякий пожарный, вдруг кто ссылку на корень создаст случайно.
2) Чтобы быстро удалить большую папку - ее можно переименовать и уже не спеша удалять.
То есть была папка /var/cache, переименовываем ее в /var/cache_old, создаем (или сама создастся) новую папку /var/cache и спокойно удаляем старую.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы