PHP удаление папок по времени
Здравствуйте!
Уважаемые знатоки PHP, смогли бы Вы написать скрипт (код) PHP, думаю для Вас это быстро и легко. Суть задачи: В директории (папке) создаются папки с файлами (txt), скрипт проверяет время создание папок, и если оно больше заданного (скажем сутки), то удаляет такую папку вместе с файлами. Все. Испробовала все, ничего не выходит. Хостинг поддерживает PHP (версия 5.6). |
Sonya, контакты в подписе, обращайтесь.
|
Цитата:
Sonya, а ты умеешь что-либо делать "быстро и легко"? Станешь ты это делать для незнакомого мужика если он попросит тебя об этом на форуме? :D |
"Т.е. отличная отговорка дабы не платить за работу." - ни в коем случае, я не ошиблась с разделом, это же раздел работа? Поэтому я и предлагаю работу. а всякая работа предусматривает оплату.
|
Почему подумала, что быстро и легко, то в Интернете, есть скрипт удаления файлов по истечению определенного времени, а кроме того есть и скрипт рекурсивного удаления папки вместе с файлами, но мне самой сложно выполнить ту задачу, о которой я и написала выше.
|
$dir = 'path/'; //путь к каталогу $check = 1; //период в днях foreach(glob($dir.'*', GLOB_ONLYDIR) as $f) { if(date_diff(date_create('now'), date_create(date('Y-m-d H:i', filemtime($f))))->format('%d') > $check) { $f = $dir . $f; chmod($f, 0777); array_map('unlink', glob($f.'/*')); rmdir($f); } } |
Цитата:
Не глянул на верх... :cray: |
Цитата:
|
Да вложений в созданных папках нет, только файлы, но имена самих папок неизвестны, они создаются в зависимости от ID пользователя. Ориентир только на время создания. Конечно, сама директория, в которой эти папки создаются известна.
|
Цитата:
|
Ответ на мыло:
Решить данную задачу можно различно, имея ввиду конкретный код. Это может быть как процедурный стиль, так и объектно ориентированный, используя традиционные for, while, ... или итераторы, используя различные функции работы с файловой системой. То что я написал, это один из примеров. В нем используется функция glob, которая находит пути удовлетворяющие шаблону. В коде показанном в качестве шаблона указывается * (любое имя), то есть если есть каталог в котором создаются папки пользователей (в коде это условно имя path), то glob($dir.'*', GLOB_ONLYDIR) получит имена всех каталогов в этом каталоге (GLOB_ONLYDIR - получить только каталоги, без их файлов). А в цикле, если текущее время минус время создания папки более указанного периода (определено в переменной $check), то также функцией glob получаются все файлы уже этого каталога - path/текущий_каталог_в_итерации, и также по маске *. В каких значениях нужно получить период для сравнения можно задать в методе format('%формат_вывода'). О том как задается формат вывода времени читайте в функции date. Чтобы иметь представление о том, что возвращает функция date_diff, запустите этот код положив его в один корень с каталогом в котором каталоги пользователей: echo '<pre>'; $dir = array_map(function($d) { $diff = date_diff(date_create('now'), date_create(date('Y-m-d H:i', filemtime($d)))); //объект содержащий информацию о разности двух дат $diff->name_dir = $d; //дополнительно вставлено в объект - имя каталога пользователя return $diff; }, glob('path/*', GLOB_ONLYDIR)); //заменить path на реальное имя каталога print_r($dir); |
По поводу куда положить скрипт:
Нужно придерживаться правила - в каталогах, которые содержат медиа данные, и в которые тем более производится запись файлов пользователей (загрузка), нужно запрещать выполнение любых скриптов. Скрипт может быть помещен куда угодно, это может быть например закрытый для внешнего доступа каталог хранящий подключаемые скрипты, если данный процесс запускается в каком либо скрипте по запросу, либо прописан в каком либо скрипте выполняющем эту задачу. Место положения скрипта будет влиять только на путь к каталогу содержащему каталоги пользователей, то есть то как он будет указан в переменной $dir. То есть, если исходить из логичного, то вряд ли на сервере есть url, который напрямую будет обращаться к скрипту выполняющему эту операцию, скорее всего это составная часть какой-то задачи, так? В примере же описан случай, когда скрипт и каталог содержащий каталоги с файлами пользователя находятся на одном уровне вложения, например от корня документов. |
Чтобы проверить изменила format('%d') на format('%i')
Директорию с файлами назвала path. Выводит ошибки: Warning: chmod() has been disabled for security reasons in Warning: rmdir(path/path/34634): No such file or directory in Первое, так понимаю политика безопасности на хостинге (или нет?). Во втором, почему-то два раза path/path/ - хотя саму папку указывает верно (34634). |
Цитата:
chmod() has been disabled for security reasons - это означает, что на вашем хосте данная функция заблокирована. Если каталоги всегда доступны на запись (смотрите какие у них права, в панели управления либо в FTP), что в общем то ни есть хорошо, то удалите эту строку кода. rmdir(path/path/34634): No such file or directory - нет такого пути, тут ваша ошибка, неверно указан путь. Два раза path в пути, значит что-то не так делается в коде или определении. |
Да вроде все, по коду, ничего не меняла, кроме format('%d') на format('%i'), даже директорию с папками переименовала в path, чтобы не отходить от оригинала.
|
Цитата:
$dir = 'users/'; Пусть этот каталог находится в корне документов, там где индексный файл, там же должен быть помещен и сам скрипт, то есть это будет выглядеть так: users usr1 usr2 usr3 .... myscript.php Каталоги usr1 ... это каталоги пользователя (имена просто для примера структуры). Если все так расположено, то $dir = равна 'users/', а в цикле foreach() путь к каталогам пользователя $f, который получается из конкатенации $dir и текущего (по итерации цикла) каталога пользователя будет равен: users/usr1 users/usr2 users/usr3 .... и никаких накладок типа users/users/usr1 не будет. |
Никак, правда и каталог и сам скрипт находятся в отдельной папке, но на одном уровне. В папке:
path - каталог с папками пользователей removal_time.php - сам скрипт |
Ясно. Удалите в коде вот это
$f = $dir . $f; Должно работать. |
Все работает! Огромное спасибо!
|
Часовой пояс GMT +3, время: 08:28. |