Постараюсь описать задачу. Имеется 1 скрипт, который генерирует файлы в папку tmp/.
После этого сразу же второй скрипт начинает отдавать файл клиенту (стартует загрузку на клиент) с поддержкой докачки (http_range), поэтому неизвестно, когда файл скачается.
После чего файл больше не нужен. Как организовать удаление файлов и по какому критерию
Пока только придумал удаление всех файлов во временной директории, время жизни которых дольше N минут.
P.S.: Я уже пытался выяснить, как определить, что файл скачался в этом вопросе.
Ответы
Ответ 1
Возможно, вариант отмороженный, но если через 10 мин можно открыть файл с помощью fopen($file, 'a'); - значит, его не качают в данный момент.
Как вариант - сделать хэндлер для загрузки, в котором разбирать Accept-Range, и делать примерно так
fseek($f, $acceptRangeStart);
$flock = @fopen('__' . basename($fileToDownload) . $acceptRangeStart, 'w+');
@fclose($flock); // создаем лок-файл
echo fread($f, $acceptRangeBytes);
@unlink('__' . basename($fileToDownload) . $acceptRangeStart);
$finished = true;
foreach (scandir('tmp') as $fn) {
if (strpos($fn, '__' . basename($fileToDownload)) !== false) {
$finished = false; // если идет докачка, сбрасываем
break;
}
}
if ($finished) { // если лок-файлов не найдено
unlink($fileToDownload); // удаляем основной файл
}
А чем вам, кстати, не нравится вариант, который используют почти все файлообменники? (Ссылка для скачивания будет доступна в течение суток и только для этого компьютера)
Ответ 2
Есть вариант при генерации файла в его имя писать дату, время. Раз в день или ра
в час (в зависимости от количества файлов в папке) по cron'у делать scandir() разбирать имя файлов и если дата меньше чем на N минут / часов / дней удалять его
Ответ 3
Я думаю вот такой вариант тоже имеет место быть.
Смысл в общем в одной функции register_shutdown_function() после завершения работы вызывается эта функция и удаляет файл который был прочитан.
В моей задаче, было важно, создать временный файл, прочитать файл и сразу после чтения удалить, собственно данный вариант с этим справляется.
Так же в место этого, можно использовать очереди задач.
/**
* @param $name
* @param $content
*
* @return string
*/
public static function temporaryFile($name, $content)
{
$file = DIRECTORY_SEPARATOR.
trim(sys_get_temp_dir(), DIRECTORY_SEPARATOR).
DIRECTORY_SEPARATOR.
ltrim($name, DIRECTORY_SEPARATOR);
file_put_contents($file, $content);
register_shutdown_function(
function () use ($file) {
unlink($file);
}
);
return $file;
}
Комментариев нет:
Отправить комментарий