1

Тема: [обсуждение] Модификация 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\файл

А дальше у меня мыслей нет. Как при прямом запросе этого файла, предварительно выполнить действие по проверке срока истечения? Или не заморачиваться и удалять все такие файлы принудительно всякий раз, когда работает менеджер аттачей?
Что скажете?

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

2

Re: [обсуждение] Модификация pun_attachment

Видимо в .htaccess нужно будет просто добавить директивы вроде этого:

RewriteEngine on
RewriteCond   %{TIME} > время_истечения
RewriteRule   ^.*$             attach_timeout

Запустится менеджер аттачей и удалит эту папку со всем содержимым, выдаст сообщение - ссылка устарела и даст ссылку на тему.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

3

Re: [обсуждение] Модификация pun_attachment

Простой вариант
1. Ограничить размер прикрепляемых файлов — я бы выставил 5 мегабайт на сообщение.
Форум не файлохранилище, надо прикрепить большой файл — используйте специализированные файлообменные сервисы.

2. Загруженные данным расширением картинки отображать только в виде ссылок.
3. При соблюдении первых двух условий, файлы можно отдавать и самим PHP.

Сложный вариант
1. Использовать NGINX.

P.S. На своём форуме отказался от аттача файлов — пользователи быстро научились пользоваться файлообменниками и вставлять ссылки. Исключения: загрузка изображений.

Смайл. Дата. Подпись.

Поделиться

4 (11.01.2012 05:04 отредактировано inipel)

Re: [обсуждение] Модификация pun_attachment

Здравствуйте, вот у меня вопрос на счет прав! загрузил я изображения на закрытый форум (закрытый от всех), и скопировал ссылки к изображению, и вставил в открытый форум, в тему, и поместил ссылку в код "img". Картинка работает только для админов! Гости видят только ссылку, а картинки нету. как сделать чтобы видна была для всех?

То есть хочу чтобы исходник был спрятан, а картинка видна для всех.

Поделиться

5

Re: [обсуждение] Модификация pun_attachment

У меня отчего-то все загруженные вложения "портятся". .doc - уменьшается при скачивании в объёме и показывает крокозяблы, .jpg - вообще пишет - "испорченный файл" а на предпросмотре пусто.
Переустанавливал 100500 раз. Обновлял до 1.4.2 сам форум, и менял соотв. версию пан_аттачмента. И ничего. На разных машинах и браузерах один и тот же результат.
Кто-то подскажет, что делать???

Ссылка на форум, на всяк пожарный... http://archiforum.org.ua/

Поделиться

6

Re: [обсуждение] Модификация pun_attachment

У тебя где-то в ланг файлах присутствует bom-заголовок. Переключись в английский и проверь. Если все работает, то 100% проблема в одном из lang-файлов локализации. Это выглядит как 3 левых символа перед <?php вначале ланг-файла.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

7

Re: [обсуждение] Модификация pun_attachment

Ура!
Переключился - не помогло. Удалил русский с сервера - заработало. Перепроверил все файлы - перед <?php ничего не нашёл. Восстановил - не работает. Закачал из архива русский, который ставил при установке - заработало!
Оказалось, собака зарыта где:) Бэк-ап на неюзаный помог!
Спасибо огромное!!!

Поделиться

8

Re: [обсуждение] Модификация pun_attachment

Здравствуйте.
Как увеличить максимальный объем загружаемого файла?
В настройка attachments нет такой возможности!
Ошибка:
Внимание! Исправьте следующие ошибки, чтобы добавить сообщение:
•Выбранный файл слишком велик. Сервер отклонил загрузку.

Поделиться

9

Re: [обсуждение] Модификация pun_attachment

это нужно в настройках php.ini подкручивать , расшиерние тут не при чем

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться