Wizard писал(а): ↑2018.02.20, 10:33
по истечению времени там могут накопится превьюшки которые не используются.
Продумайте организацию хранения и удаления файлов таким образом, чтобы мусора в вашей системе не было в принципе. Имхо, это самое первое с чего нужно начинать. И, когда, начинаешь двигаться в этом направлении, то понимаешь, что готовых решений нет. Ключевой момент: удалить картинку так, чтобы не осталось мусора в виде превьюх.
Например, у меня алгоритм такой.
1. Есть дерево категорий, например, дерево категорий продуктов. В БД данные хранятся в виде дерева nested sets, в FS в виде плоского списка категорий продуктов по id категории. Например: uploads/products/1, uploads/products/2, ... uploads/products/n, где цифры - это id категории.
2. К каждой категории относятся несколько продуктов, например к категории с id ==1, относятся продукты с id == 1, id == 2, id == 3. Картинки для каждого продукта также хранятся в каталоге с именем == id продукта. На моем примере продукт с id == 1 хранится в каталоге uploads/products/1/1, c id == 2 в uploads/products/1/2 и т.д.
3. Предположим, что у продукта с id == 1 есть несколько картинок и превьюх (большие превью и маленькие с какими-то размерами). Например, есть большая картинка 1.jpg (uploads/products/1/1/1.jpg) и должны быть две превьюхи.
Например:
uploads/products/1/1/small_thumb/1.jpg
и
uploads/products/1/1/large_thumb/1.jpg.
Базовое имя файла не меняется, но это разные файлы, т.к. лежат по разным адресам, и у них разные размеры, сами файлы генерируются "на лету". И превьюхи всегда доступны! Если файла нет, он генерируется.
4. Для удаления я использую fileHelper, он находит все картинки с одинаковыми базовыми именами, и мусора не остается.
Код: Выделить всё
class DeleteImages
{
public static function deleteImages(string $dir, string $image)
{
$webRoot = FileHelper::normalizePath(yii::getAlias('@webroot'));
if ($images = FileHelper::findFiles($webRoot . $dir, ['only' => [$image]])) {
foreach ($images as $img) {
unlink($img);
}
}
}
}
=====================
Я не утверждаю, что это идеальный алгоритм, но тем не менее мусора в виде превьюх у меня нет.