10.10.2023 06:59:25 am
Для обработки файлов, которых довольно много, задумал я сделать "поэтапное" сканирование файлов. Задача такая: надо получить список из нескольких файлов, скажем из первых ста файлов, проверить каждый файл в БД, затем перейти к получению следующей сотке файлов. И так, пока все файлы не будут проверенны.
К сожалению, для сканирования файлов нет оператора
Я уже думал о том, чтобы получать все файлы разом, затем разбивать их на группы и работать по группам (Блог: Как получить первые | последние несколько элементов массива на PHP), но опять же, сканирование будет производиться всех файлов сразу, а файлов очень много. Не подходил мне этот вариант.
Тогда пришла в голову идея: разделить все файлы по папкам, такого вида:
Папки именовались "годом > месяцем > днем" - в какой день загружен файл, в ту папку и попадает.
Теперь я могу получать содержимое каждой папки, по отдельности.
Во первых получаем список всех папок массивом, например:
Теперь получаем файлы с каждой папки, по отдельности, например, так:
Где
Я добавил в крон задание: выполнять получение файлы из одной папки, по очереди, каждые пять секунд. Значение
Как будут обработаны файлы из последней папки, метод вернет
К сожалению, для сканирования файлов нет оператора
LIMIT
, как в MySQLi, по этому можно получить только все содержимое папки, с подпапками, либо без них... А было бы удобно иметь LIMIT
.Я уже думал о том, чтобы получать все файлы разом, затем разбивать их на группы и работать по группам (Блог: Как получить первые | последние несколько элементов массива на PHP), но опять же, сканирование будет производиться всех файлов сразу, а файлов очень много. Не подходил мне этот вариант.
Тогда пришла в голову идея: разделить все файлы по папкам, такого вида:
2023/9/11/
2022/7/5/
2022/4/21/
2022/7/5/
2022/4/21/
Папки именовались "годом > месяцем > днем" - в какой день загружен файл, в ту папку и попадает.
Теперь я могу получать содержимое каждой папки, по отдельности.
Во первых получаем список всех папок массивом, например:
$folders
:
Array
(
[0] => 'file/2018/8/2/',
[1] => 'file/2018/8/5/',
[2] => 'file/2019/4/8/',
[3] => 'file/2022/11/7/',
[4] => 'file/2023/2/15/',
...
)
Теперь получаем файлы с каждой папки, по отдельности, например, так:
$files = scandir($folders[$n]);
Где
$n
номер (Ключ) директории, от куда надо получить файлы.Я добавил в крон задание: выполнять получение файлы из одной папки, по очереди, каждые пять секунд. Значение
$n
, после каждого выполнения становится на один больше:
$n++;
Как будут обработаны файлы из последней папки, метод вернет
true
и задание будет удалено из крона:
if ($folders[$n] == end($folders))
{
return true;
}
- Жалоба
10.10.2023 06:22:34 pm
На одном форуме мне подсказали: если файлы имеют похожие названия, разница лишь в их ID, например:
То тут просто прогоняем через цикл, с установленным началом и лимитом:
Вот и все. Данный вариант удобен. Но мне не подходит, так как у меня файлам даются рандомные названия.
file-1.txt
file-2.txt
file-3.txt
file-4.txt
file-5.txt
file-2.txt
file-3.txt
file-4.txt
file-5.txt
То тут просто прогоняем через цикл, с установленным началом и лимитом:
$beginning = 0;
$limit = 100;
$end = $beginning + $limit;
for ($i = $beginning; $i < $end; $i++)
{
$file = 'file-' . $i . '.txt';
// Работаем с файлом ($file)
}
Вот и все. Данный вариант удобен. Но мне не подходит, так как у меня файлам даются рандомные названия.