|
|
|
| Всем доброго дня!
На удаленном сервере есть папка "foto" с фотографиями, которые добавляются пользователями на сайт.
Путь к этим фото хранится в базе данных.
Бывают случаи, после срабатывания кода по удалению фото со страницы пользователями, фото все же остаются в папке (иногда остаются оригиналы загруженных фото), а пути удаляются из базы.
Хотелось бы создать что то вроде "чистильщика" папки фото от ненужных файлов, путей к которым нет в базе данных на момент "чистки". | |
|
|
|
|
|
|
|
для: segazav
(30.05.2013 в 08:20)
| | это не сложно, нужно лишь обойти директорию и каждый найденный файл поискать в базе. если нашли - оставляем, иначе - удаляем. иногда такие скрипты работают через cron | |
|
|
|
|
|
|
|
для: psychomc
(30.05.2013 в 09:33)
| | Это получается будет цикл в цикле, а если файлов 30 000 шт. - будет мощная нагрузка на сервер. | |
|
|
|
|
|
|
|
для: segazav
(30.05.2013 в 10:13)
| | Сперва запрос к базе, а удаление тех, которых нет в ней.
Но не мешало бы сперва разобраться почему такое происходит. Удалять нужно сперва файл, а только затем запись о нем, и если удаление не произошло, значит ошибка, и запись не трогаем, или сохраняем ссылку на сбой, или еще что-то, но только не так - выкорчевали одно, совсем не проверяя связей, и забыли об этом. | |
|
|
|
|
|
|
|
для: segazav
(30.05.2013 в 08:20)
| |
Путь к этим фото хранится в базе данных.
|
Это неправильно, хранить нужно только имя файла, без полного пути.
Делается примерно так
<?php
$path = '../path/to/fotodir/'; // полный путь к папке с файлами
// находим имена файлов в папке
foreach (glob($path . '*') as $fname)
$arr[] = substr(strrchr($fname, '/'), 1);
// находим имена файлов в бд
$res=mysql_query('SELECT fotoname FROM table');
while ($row=mysql_fetch_assoc($res))
$dbarr[] = substr(strrchr($row['fotoname'], '/'), 1); // если там действительно полный путь
// ищем каждое имя из папки в массиве имен из бд
$size = count($arr);
$c = 0;
for($i=0; $i<$size; $i++)
if(!in_array($arr[$i], $dbarr))
if(unlink($path . $arr[$i])) $c++; // если нет, то удаляем файл
echo 'Удалено: ' . $c . ' файлов';
?>
|
Но проблема совсем не в этом, как уже заметили.
Ошибка в вашем коде, который не удаляет файлы. | |
|
|
|
|
|
|
|
для: DangerBay
(30.05.2013 в 17:49)
| | substr(strrchr($row['fotoname'], '/'), 1) > basename() | |
|
|
|
|
|
|
|
для: confirm
(31.05.2013 в 14:14)
| | :) | |
|
|
|