Страницы

Поиск по вопросам

вторник, 26 ноября 2019 г.

Алгоритм удаления временных файлов


Постараюсь описать задачу. Имеется 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; }

Комментариев нет:

Отправить комментарий