Выгрузка отчётов: как лучше организовать хранение файлов?

Добрый день!

Сделал у себя на сайте PHP-скрипт генерации отчётов в Excel-формате (XLS), CSV и текстовом виде для программы-просмотрщика.

Скрипт запускается каждый день в 00:05 и создаёт отчёты за прошедший день для всех объектов в базе. Например, для 29 апреля получается что-то вроде:
объект-1/отчёт-2014-04-29.xls
объект-1/отчёт-2014-04-29.csv
объект-1/отчёт-2014-04-29.txt
объект-2/отчёт-2014-04-29.xls
объект-2/отчёт-2014-04-29.csv
объект-2/отчёт-2014-04-29.txt
объект-3/... и так далее

Проблема следующая. Каждый отчёт весит до 1.2 Мб (36000 строк), а с учётом того, что их делается три вида, общий вес получается порядка 3.6-3.8 Мб за день. Пространства на диске у меня всего 10 Гб, на соседнем разделе 20, но туда я делаю дампы БД, так что это не вариант :)

Какие варианты решения пришли в голову:
1) Хранить файлы только за последний месяц
Плюсы: ест меньше места
Минусы: история не сохраняется, и остаётся ограничение в количестве объектов: если их будет больше 100, то даже месяц не получится хранить
2) Грузить файлы на сторонний файлообменник (Яндекс.Диск, например) и работать через него
Плюсы: много места (на ЯДиске 200 Гб)
Минусы: непонятно, как это сделать
3) Генерировать отчёты на лету по запросу пользователя, хранить их один день и потом удалять все сгенерированные файлы
Плюсы: не требует много места и решает задачу
Минусы: долгая выгрузка по времени, работа с БД в любое время и возможные утечки памяти (для Excel использую либу PHPExcel)

Какой вариант лучше подойдёт? И как бороться с минусами подходящего варианта?
  • Вопрос задан
  • 3521 просмотр
Решения вопроса 1
crackedmind
@crackedmind
web-developer
А чем собственно данные в xls, csv & txt отличаются? Почему бы не генерировать по крону, например только csv, а остальное на лету?
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@kfuntov
Просто чтение csv быстрее выборки из базы.
+ можно гзиповать раз в неделю csv, которые старше месяца. Это сильно сократит размер.
Ответ написан
DaFive
@DaFive
Мы в проекте храним отчеты в архивных таблицах (старше 2 месяцев). По запросу пользователя выбираются нужные данные, на лету создается xls и csv и собирается в архив с уникальным именем и отдается пользователю. Затем файлы (архивы) старше определенного периода (не скажу сколько точно) удаляются с сервера. Если пользователь не найдет отчета - всегда может создать заново.
Ответ написан
EugeneOZ
@EugeneOZ
Храните на Amazon S3 или Google Cloud Storage. Для них есть API, SDK - сделаете за пару часов работу с ними у себя в скрипте. И место там стоит дёшево и доступность со всей планеты быстрая.
Ответ написан
Комментировать
Arris
@Arris
Сапиенсы учатся, играя.
if (function_exists('gzcompress')) {
    $gz = gzopen($path.$fname.".gz", "wb9");
    gzwrite($gz, file_get_contents($path.$fname.".sql"));
    gzclose($gz);
    unlink($path.$fname.".sql");
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы