Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 29.12.2016, 17:05
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

Решить данную задачу можно различно, имея ввиду конкретный код. Это может быть как процедурный стиль, так и объектно ориентированный, используя традиционные 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);
Ответить с цитированием
  #12 (permalink)  
Старый 29.12.2016, 17:54
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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

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

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

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

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

Последний раз редактировалось laimas, 29.12.2016 в 18:00.
Ответить с цитированием
  #13 (permalink)  
Старый 29.12.2016, 18:52
Профессор
Отправить личное сообщение для Sonya Посмотреть профиль Найти все сообщения от Sonya
 
Регистрация: 07.07.2016
Сообщений: 273

Чтобы проверить изменила 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).
Ответить с цитированием
  #14 (permalink)  
Старый 29.12.2016, 19:59
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от 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 в пути, значит что-то не так делается в коде или определении.

Последний раз редактировалось laimas, 29.12.2016 в 20:21.
Ответить с цитированием
  #15 (permalink)  
Старый 29.12.2016, 20:33
Профессор
Отправить личное сообщение для Sonya Посмотреть профиль Найти все сообщения от Sonya
 
Регистрация: 07.07.2016
Сообщений: 273

Да вроде все, по коду, ничего не меняла, кроме format('%d') на format('%i'), даже директорию с папками переименовала в path, чтобы не отходить от оригинала.
Ответить с цитированием
  #16 (permalink)  
Старый 29.12.2016, 20:59
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от 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 не будет.
Ответить с цитированием
  #17 (permalink)  
Старый 29.12.2016, 21:41
Профессор
Отправить личное сообщение для Sonya Посмотреть профиль Найти все сообщения от Sonya
 
Регистрация: 07.07.2016
Сообщений: 273

Никак, правда и каталог и сам скрипт находятся в отдельной папке, но на одном уровне. В папке:
path - каталог с папками пользователей
removal_time.php - сам скрипт
Ответить с цитированием
  #18 (permalink)  
Старый 29.12.2016, 22:13
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

$f = $dir . $f;

Должно работать.
Ответить с цитированием
  #19 (permalink)  
Старый 29.12.2016, 22:44
Профессор
Отправить личное сообщение для Sonya Посмотреть профиль Найти все сообщения от Sonya
 
Регистрация: 07.07.2016
Сообщений: 273

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести в html с помощью Java переменную PHP DDSSDD Серверные языки и технологии 12 14.07.2016 22:11
Имеет ли смысл браться за node.js вместо php в целях экономии времени? PesBarbos Node.JS 7 18.03.2015 09:49
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
вывод времени php + javascript TTongorovortoto Ваши сайты и скрипты 2 29.10.2011 00:11
Как передать картинку из javascript в php KIVagant AJAX и COMET 3 12.05.2010 11:54