Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Можно ли начать читать папку сразу с i-го файла?
чтобы узнать список файлов в директории. Скажите есть ли в php возможность не начинать читать список файлов в папке с начала, а например с i-го по порядку. Не важно, по чему сортировать файлы в папке, главное не тратить время на чтение названий тех файлов, что не нужны
Мелкий
Отправлено: 28 Июля, 2017 - 15:22:29
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
readdir - довольно глупый прокси к syscall. В каком порядке будет возвращать файлы - сугубо на усмотрение ОС. Порядок возврата не гарантируется даже между разными вызовами opendir. А поскольку не гарантируется никакого порядка - то и консистентно смещение сделать невозможно.
----- PostgreSQL DBA
borus
Отправлено: 28 Июля, 2017 - 15:48:43
Новичок
Покинул форум
Сообщений всего: 52
Дата рег-ции: Май 2012
Помог: 0 раз(а)
Мелкий пишет:
readdir - довольно глупый прокси к syscall. В каком порядке будет возвращать файлы - сугубо на усмотрение ОС. Порядок возврата не гарантируется даже между разными вызовами opendir. А поскольку не гарантируется никакого порядка - то и консистентно смещение сделать невозможно.
Спасибо! А как тогда читать в php содержимое одной и той же директории каждый раз в одном и том же порядке?
Мелкий
Отправлено: 28 Июля, 2017 - 15:59:21
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Прочитать всё и как-нибудь отсортировать.
Использовать scandir, например, чтобы не самостоятельно в php этим заниматься.
----- PostgreSQL DBA
borus
Отправлено: 28 Июля, 2017 - 17:10:37
Новичок
Покинул форум
Сообщений всего: 52
Дата рег-ции: Май 2012
Помог: 0 раз(а)
Мелкий пишет:
Прочитать всё и как-нибудь отсортировать.
Спасибо. А другие варианты есть, чтобы по частям получать?
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 74 раз(а)
borus пишет:
А другие варианты есть, чтобы по частям получать?
Да, glob('тут_шаблон');
Мелкий
Отправлено: 28 Июля, 2017 - 17:49:00
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Емнип, иноды всё равно читать и перебирать надо все относящиеся к этой директории чтобы получить какой-то консистентный во времени срез данных. Так что вопрос только на каком уровне это делать.
А в чём в целом задача?
----- PostgreSQL DBA
LIME
Отправлено: 28 Июля, 2017 - 21:36:31
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
думаю задача чисто гипотетическая
иначе можно было бы решить кэшируя и поддерживая кэш на уровне приложения borus вариант? (Добавление)
Строитель пишет:
Да, glob('тут_шаблон');
Цитата:
You could do this using fnmatch, by reading the directory entries one by one and testing each one with fnmatch. But that would be slow
Покинул форум
Сообщений всего: 52
Дата рег-ции: Май 2012
Помог: 0 раз(а)
Доброе утро! Спасибо!
Мелкий пишет:
А в чём в целом задача?
Разрабатываю расширение для Joomla, которое должно будет сканировать порционально большие папки с картинками(~40000 файлов), и проверять наличие этих файлов в базе данных. Порционально(с использованием ajax), чтобы не вылетел белый экран. Поэтому ищу метод, чтобы брать каждый раз следующую порцию файлов, которая ещё не рассматривалась. Это как-то меняет решение?
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Да, меняет. Получить список 40к файлов и отсортировать почти ничего не стоит в контексте http-запроса. В общем-то, всего 40к записей проверить на наличие в базе - легко делается в один проход.
SELECT filename FROM tmptable tt WHERENOTEXISTS(SELECT 1 FROM regulartable rt WHERE tt.filename = rt.filename)-- этих файлов нет
DROP temp TABLE tmptable
----- PostgreSQL DBA
borus
Отправлено: 31 Июля, 2017 - 16:17:58
Новичок
Покинул форум
Сообщений всего: 52
Дата рег-ции: Май 2012
Помог: 0 раз(а)
Здравствуйте!
Мелкий пишет:
Да, меняет.
Спасибо. Поясните, пожалуйста, только как вы предлагаете прочитать 40К файлов из файловой системы? Для того, чтобы не превисить всякие лимиты(по статистике на простых хостингах это 30 сек насколько знаю) на исполнение скриптов, я и пытаюсь разбить чтение папки с помощью ajax
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.