Тема: [обсуждение] Модификация pun_attachment
Всем привет.
Как многим известно, pun_attachment отдает файлы не напрямую, а средствами php - открывает файл читает его целиком и выкидывает прочитанное в буфер (если при этом не подавится).
Думаю многие понимают, что это наименее адекватный способ для работы с аттачами:
Ресурсов, выделенных для процесса php может не хватить (например лимит 96Мб, а файл - 98Мб)
Если аттачи используются для картинок в сообщениях, увеличивается нагрузка - каждая картинка должна целиком прочитаться, потом только прочитанное начинает отдаваться.
Если картинок в теме много, то получается очень нехорошая ситуация в плане нагрузки на сервер.
Отдавать файлы средствами пхп просто неправильно по сути, это должен делать веб-сервер
Кроме этого не поддерживается дозакачка или закачка в несколько потоков.
Как можно исправить ситуацию?
Первое решение в лоб - не прятать аттачи, сделать доступными для загрузки напрямую, переложив функции обработки запросов на веб-сервер.
Наверное кого-то оно устроит, но многим хотелось бы ограничить бесконтрольное скачивание прикрепленных файлов.
Отсюда вытекает второй варинт решения:
1) разделить аттачи и изображения. Т.е. если изображение вставляется как аттач - это аттач и он не может быть отображен, его можно только скачать
2) ссылка в сообщении на аттач - промежуточная, переход по ней не отдает сам аттач, а только генерирует прямую ссылку на прикрепленный файл. Эта ссылка существует лишь определенное время и привязана к ip-адресу запросившего файл.
Первая часть реализуется достаточно просто простым удалением некоторых фрагментов из расширения.
Вторая часть сложнее и о ней я собственно хотел поговорить.
Как я вижу это.
Ссылка на аттач формируется такого вида: punbb.ru\attach\sduisad5665sd6adsd
1)При таком запросе обрабатывать его будет менеджер аттачей, он проверяет наличие по такому хешу аттача, проверяет права доступа и если все ок, то:
2)создает ссылку (ln) на оригинальный файл в папке вида rerjkcfkjdvu75487fd, это имя является идентификатором, в бд создается запись вида:
имя папки ип время истечения ид-сообщения
rerjkcfkjdvu75487fd 127.0.0.1 12043094344 343В этой же папке создает файл .htaccess с запретом для всех кроме этого ИП.
3) Отдает пользователю ссылку для скачивания вида punbb.ru\get_attach\rerjkcfkjdvu75487fd\файл
А дальше у меня мыслей нет. Как при прямом запросе этого файла, предварительно выполнить действие по проверке срока истечения? Или не заморачиваться и удалять все такие файлы принудительно всякий раз, когда работает менеджер аттачей?
Что скажете?