php удалить файлы старше n дней
Удаление файлов старше n дней
Иногда надо сделать удаление файлов старше n дней. Например Backup’ ы. Можно делать это вручную, отсортировать их по дате и удалить, а можно воспользоваться скриптом. В данном примере мы рассмотрим скрипт для удаления файлов старше n дней и добавим задание в планировщик Windows Server 2012R2.
Иногда надо сделать удаление файлов старше n дней. Например Backup’ ы. Можно делать это вручную, отсортировать их по дате и удалить, а можно воспользоваться скриптом. В данном примере мы рассмотрим скрипт для удаления файлов старше n дней и добавим задание в планировщик Windows Server 2012R2.
Содержание:
1. Скрипт удаления файлов старше n-дней
2. Создание задания в планировщике задач
#Скрипт удаления файлов старше n-дней
Скрипт на самом деле очень простой, создается в PowerShell и выглядит он следующим образом:
Вот так это выглядит в PowerShell:
Осталось только его выполнить и все.
#Создание задания в планировщике задач
Итак, что нам для этого надо?
Выбираем пункт «Создать задачу«:
На вкладке «Общие» задаем имя задания, его описание и пользователя, от которого оно будет выполняться. По умолчанию там будет пользователь, под которым вы вошли в данный момент в систему.
Далее переходим на вкладку «Триггеры» и создаем расписание, когда мы будем запускать наше задания. У меня настроено в 10:00 каждые 2 дня.
Далее идем на вкладку «Действия» и задаем действие, которое будет выполняться. Выбираем «Запуск программы»
программу или сценарий
и указываем путь до PowerShell:
А аргументе указываем путь до нашего скрипта, который мы создали ранее:
Нажимаем «Ок» и еще раз «Ок«
Все, на этом наше задание создано. Осталось дождаться, когда будет выполнено наше действие по расписанию и проверить, все ли правильно было настроено.
Быстрый способ удаления папки на PHP
В РНР для удаления файла существует функция unlink (), для удаления пустого каталога — rmdir (). Что делать если нужно рекурсивно удалить папку со всеми файлами и подкаталогами. На помощь приходит glob () в связке с array_map ().
Заметьте, что в функции нет ни единого цикла.
Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все.
Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса.
Ведет блог о разработке, дайджест в телеграмме и в ВК.
Спасибо за идею, но у меня эта функция не сработала так, как хотелось бы. Я немного подкорректировал функцию и вызов. Теперь она удаляет указанную папку со всеми подпапками и файлами:
function removeDir($path) <
return is_file($path)?
@unlink($path):
array_map(‘removeDir’,glob($path.»/*»))==@rmdir($path);
>
Да, вы правы — так будет лучше. Поправил в статье.
А если removeDir в классе определять? Как указывать первый параметр array_map?
Все достаточно просто
array_map(array($this, ‘removeDir’), glob(. ))
Вы не правы насчет не используются цикла как рас используются вы применяется callback функцию что рекурсивно вызывается на каждое значение массива
Визуально в коде нет ни одного цикла. Код читается проще. О внутреннем устройстве функций РНР речи не идет.
А можете объяснить нубу почему эта функция у меня ругается на фигурные скобки в условии, а если их удалить, то начинает ругаться на собаку?
Текст ошибки в студию!
А, да всё… Я решил проблему — не использую этот скрипт. Всё равно там же используется скрипт создания субдомена через cPanel. Я его немного дописал и он ещё и папки теперь удаляет.
То есть ошибку не покажите?
в стоке 2 не хватает скобки
if (is_file($path) <
вот и ошибка
Вообще чувак cPanel дописывает, такой фигни не заметил =) гы.
серврере ложится надо что-то полегче
Service Temporarily Unavailable
The server closed the connection without sending any data.
The server is temporarily unable to service your request due to maintenance downtime or capacity problems.
Due to heavy load on the server, connections may be temporarily blocked from locations that fetch an unusually high number of pages.
We apologize for the inconvenience.
Как удалить все файлы из папки с помощью PHP?
У меня большое количество посетителей в день и создаётся до 50 тысяч сессий в день. Пишу скрипт, чтобы когда число сессий в папке mod-tmp превысит 20 тысяч, сервер удалял бы из неё все файлы и перезагружался. Помогите, пожалуйста, как с помощью PHP удалить все файлы из 1 папки?
7 ответов 7
Вот самый быстрый и лёгкий способ:
Удалить средствами php сразу все не получится. Только в цикле. Возможно следует посмотреть в сторону демонов, как сказал @Inart.
Код для пхп:
Грубый подход, очень грубый:
Это сработает только в Linux. Еще раз скажу, подход очень грубый и лучше такого не использовать НИКОГДА.
Вероятно, всё намного проще. ISPManager криво меняет конфиг php отключая сборщик мусора сессий.
Открывайте конфиг php. По-дефолту /etc/php.d/apache/php.ini
Меняйте параметр session.gc_probability=0 в значение 1
Перезапускаете аппач /etc/init.d/apache2 restart
Всё, сборка мусора снова — дело php.
bash как удалить файлы и директории, старше x-дней?
Есть некая директория Test. В ней находятся файлы и папки. Как удалить только то, что старше 10 дней к примеру.
приводит к удалению и самой директории Test, если в ней нет свежих файлов, естественно.
Там не только файлы под удаление, но и папки, в том то и проблема.
При Test, без свежих файлов, удаляет и саму Test
Разница в скорости будет незаметна, но зато есть везде, ибо posix. Но для не \;, а +
При Test, без свежих файлов, удаляет и саму Test
Вариант с * не затронет сам каталог
Утилита tmpwatch. Одна короткая строчка. И никаких предлагаемых тут нагромождений.
приводит к удалению и самой директории Test, если в ней нет свежих файлов, естественно.
делай touch /path/to/search/dir/.placeholder перед запуском find и всё. Никаких find dir/*, это пропустит все файлы и директории начинающиеся с точки «.»
с возможностью появления завтра у ТСа еще вопроса, например, что делать, если
Задачи нужно решать по условию и по мере поступления, а не прикидываться Вангой.
Задачи нужно решать по условию и по мере поступления, а не прикидываться Вангой.
Вот только у вас не Ванга, а натуральный наполеонизм какой-то. Я комментировал не вас, а teod0r-а, который комментировал скрипт bash как удалить файлы и директории, старше x-дней? (комментарий)
Скорее всего я просто не совсем верно интерпретировал ваш пост.
Удаление директории в PHP
Доброго времени суток, дорогие читатели. Сегодня хотелось бы поговорить на тему удаления директории в PHP. Казалось бы, что операция не является сложной, однако некоторые нюансы имеют место быть. Давайте рассмотрим способы, как можно это сделать.
В PHP для этого предусмотрена функция rmdir(). В качестве аргумента она принимает путь до директории, которую Вы хотите удалить. Однако, директория должна быть пустая — это главное условие (если не считать того, что у пользователя, от которого работает веб-сервер, должны быть права на запись для директории). Если в директории будут размещены файлы, то мы получим ошибку при вызове функции. Соответственно, приходим к выводу, что директорию перед использованием функции rmdir() необходимо предварительно очистить.
В сети советуют написать функцию, которой в качестве аргумента будет передаваться путь к директории, которую нам необходимо удалить. В теле функции необходимо организовать листинг содержимого директории, в рамках которого осуществляется проверка — является ли файл директорией. Если файл является директорией, то по данному условию функция вызывает себя. Это необходимо для зачистки вложенных директорий, и это будет работать на всех уровнях вложенности. В ином случае, для файла применяется функция unlink() — она предназначена для удаления файла. За рамками данной проверки на последнем шаге мы удаляем директорию.
Пример реализации:
Какие проблемы у данного кода?
В итоге, функция обретает следующий вид:
Код рабочий, но на самом деле можно было сделать и проще. В PHP существует класс FilesystemIterator, который уже по умолчанию имеет необходимые нам настройки. В конструктор передается путь до директории, листинг которой нам нужен. Нам достаточно просто создать объект.
В заключение хотелось бы отметить еще один быстрый способ. Корректность его использования весьма сомнительна — отправить команду на выполнение в SHELL.
Обращаю внимание на высокий расход памяти и на то, что зачастую администраторы запрещают использовать на сервере такого рода функции в целях безопасности.