Javascript-форум (https://javascript.ru/forum/)
-   Работа (https://javascript.ru/forum/job/)
-   -   PHP удаление папок по времени (https://javascript.ru/forum/job/66644-php-udalenie-papok-po-vremeni.html)

Sonya 29.12.2016 14:33

PHP удаление папок по времени
 
Здравствуйте!
Уважаемые знатоки PHP, смогли бы Вы написать скрипт (код) PHP, думаю для Вас это быстро и легко.
Суть задачи:
В директории (папке) создаются папки с файлами (txt), скрипт проверяет время создание папок, и если оно больше заданного (скажем сутки), то удаляет такую папку вместе с файлами. Все.
Испробовала все, ничего не выходит. Хостинг поддерживает PHP (версия 5.6).

ruslan_mart 29.12.2016 15:28

Sonya, контакты в подписе, обращайтесь.

ksa 29.12.2016 15:32

Цитата:

Сообщение от Sonya
думаю для Вас это быстро и легко

Т.е. отличная отговорка дабы не платить за работу. :D

Sonya, а ты умеешь что-либо делать "быстро и легко"? Станешь ты это делать для незнакомого мужика если он попросит тебя об этом на форуме? :D

Sonya 29.12.2016 15:48

"Т.е. отличная отговорка дабы не платить за работу." - ни в коем случае, я не ошиблась с разделом, это же раздел работа? Поэтому я и предлагаю работу. а всякая работа предусматривает оплату.

Sonya 29.12.2016 15:53

Почему подумала, что быстро и легко, то в Интернете, есть скрипт удаления файлов по истечению определенного времени, а кроме того есть и скрипт рекурсивного удаления папки вместе с файлами, но мне самой сложно выполнить ту задачу, о которой я и написала выше.

laimas 29.12.2016 15:56

$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);
    }    
}

ksa 29.12.2016 15:57

Цитата:

Сообщение от Sonya
Поэтому я и предлагаю работу. а всякая работа предусматривает оплату.

Пардон. :thanks:
Не глянул на верх... :cray:

laimas 29.12.2016 15:59

Цитата:

Сообщение от Sonya
а кроме того есть и скрипт рекурсивного удаления папки вместе с файлами

Рекурсия нужна, если есть вложения каталогов, а по вопросу такого нет.

Sonya 29.12.2016 16:12

Да вложений в созданных папках нет, только файлы, но имена самих папок неизвестны, они создаются в зависимости от ID пользователя. Ориентир только на время создания. Конечно, сама директория, в которой эти папки создаются известна.

laimas 29.12.2016 16:24

Цитата:

Сообщение от Sonya
но имена самих папок неизвестны, они создаются в зависимости от ID пользователя

Я написал - glob с маской *, что еще надо?

laimas 29.12.2016 17:05

Ответ на мыло:

Решить данную задачу можно различно, имея ввиду конкретный код. Это может быть как процедурный стиль, так и объектно ориентированный, используя традиционные 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);

laimas 29.12.2016 17:54

По поводу куда положить скрипт:

Нужно придерживаться правила - в каталогах, которые содержат медиа данные, и в которые тем более производится запись файлов пользователей (загрузка), нужно запрещать выполнение любых скриптов.

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

Место положения скрипта будет влиять только на путь к каталогу содержащему каталоги пользователей, то есть то как он будет указан в переменной $dir.

То есть, если исходить из логичного, то вряд ли на сервере есть url, который напрямую будет обращаться к скрипту выполняющему эту операцию, скорее всего это составная часть какой-то задачи, так?

В примере же описан случай, когда скрипт и каталог содержащий каталоги с файлами пользователя находятся на одном уровне вложения, например от корня документов.

Sonya 29.12.2016 18:52

Чтобы проверить изменила 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).

laimas 29.12.2016 19:59

Цитата:

Сообщение от Sonya
Чтобы проверить изменила format('%d') на format('%i')

Это уж как хотите, но можно и иначе производить сравнение - ко времени создания папки, а оно возвращается в timestamp, добавлять количество секунд как вам и хотелось, и сравнивать с меткой текущего времени - time().

chmod() has been disabled for security reasons - это означает, что на вашем хосте данная функция заблокирована. Если каталоги всегда доступны на запись (смотрите какие у них права, в панели управления либо в FTP), что в общем то ни есть хорошо, то удалите эту строку кода.

rmdir(path/path/34634): No such file or directory - нет такого пути, тут ваша ошибка, неверно указан путь. Два раза path в пути, значит что-то не так делается в коде или определении.

Sonya 29.12.2016 20:33

Да вроде все, по коду, ничего не меняла, кроме format('%d') на format('%i'), даже директорию с папками переименовала в path, чтобы не отходить от оригинала.

laimas 29.12.2016 20:59

Цитата:

Сообщение от Sonya
даже директорию с папками переименовала в path, чтобы не отходить от оригинала.

Нужно хорошо понимать и ориентироваться "где находимся". Вернемся к примеру, в нем указан путь к каталогу, в котором каталоги, в которых файлы, и назовем его 'users/':

$dir = 'users/';

Пусть этот каталог находится в корне документов, там где индексный файл, там же должен быть помещен и сам скрипт, то есть это будет выглядеть так:

users
    usr1
    usr2
    usr3
    ....
myscript.php


Каталоги usr1 ... это каталоги пользователя (имена просто для примера структуры).

Если все так расположено, то $dir = равна 'users/', а в цикле foreach() путь к каталогам пользователя $f, который получается из конкатенации $dir и текущего (по итерации цикла) каталога пользователя будет равен:

users/usr1
users/usr2
users/usr3
....

и никаких накладок типа users/users/usr1 не будет.

Sonya 29.12.2016 21:41

Никак, правда и каталог и сам скрипт находятся в отдельной папке, но на одном уровне. В папке:
path - каталог с папками пользователей
removal_time.php - сам скрипт

laimas 29.12.2016 22:13

Ясно. Удалите в коде вот это

$f = $dir . $f;

Должно работать.

Sonya 29.12.2016 22:44

Все работает! Огромное спасибо!


Часовой пояс GMT +3, время: 08:28.