Забыли пароль?
Запросите новый здесь.

Автор темы: mirivlad
ID темы: 1872
Информация:
Тема содержит 9 сообщения, была просмотрена 3463 раз.  Имеются прикрепленные файлы.
Просмотр темы
PHP-Fusion Russia » Расширения » Хаки/скрипты
 Распечатать тему
Замена img_bb_code
mirivlad
На форуме одного из моих сайтов пользователи любят выкладывать в темы изображения со сторонних ресурсов. В Php-Fusion за отображение картинки с другого сервера отвечает bb-код
Скачать исходники  Код
[img]



Однако вылезла проблема. Если вставить в тему картинку большого размера с медленного сервера, то функция которая проверяет размер картинки удаленного файла - не успевает отработать так как скрипт отрубается сервером по timeout. Вариант с увеличением таймаута не подходит, так как время которое будет затрачено на получение картинки - неизвестно и может быть разным. Я решил эту проблему - получение заголовка картинки и определения content-type с помощью расширения curl.
По сути - загружается не картинка, а только заголовок который отдает удаленный сервер. Из этого заголовка выясняется - на самом ли деле мы получаем картинку. Таким образом скорость загрузки страницы с большим количеством тяжелых картинок увеличивается в разы за счет того что мы получаем не всю картинку, а только заголовки.
В аттаче измененный img_bb_code_includes. Куда распаковывать, думаю, знаете.

AHTUNG! Перед тем как менять файлы - сделайте backup! Убедитесь что у вас установлено расширение PHP - curl.
mirivlad присоединено следующее:файл:
Вы не можете видеть вложения в этой теме.

Изменил(а) mirivlad, 01.11.2013 06:00
x2
 
Web
mirivlad
Быстрофикс:
Если вместо ответа сервера нам прилетит херня - заголовок не распарсится и скрипт аварийно завершался. FIX
Если вместо картинки адрес ведет на страницу с редиректом на скрипт который генерит какую-либо линейку и прочюю картинку с меняющейся информацией - то скрипт не следовал за редиректами и картинка отображалась как неверная.

В прицепе обновил архив.
 
Web
Polarfox
Можно послать заголовок в 1 байт на запрос серверу...

быстрофикс это старый ббкод без извращений, имхо.
Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле. | Вся бесплатная тех. поддержка только на форуме
 
mirivlad
PolarFox написал:

Можно послать заголовок в 1 байт на запрос серверу...

быстрофикс это старый ббкод без извращений, имхо.

угу. старый код со старыми xss ^_^
Ты правда чтоли не понимаешь для чего сделана проверка - является ли то что юзверь ставит в bb-код урлом на картинку или нет? Просто во фьюженовском коде это сделано через жопу. Без выставления таймаута, со сверхпроверкой - получением всей картинки перед тем как определеить её mime-type
 
Web
SchreiBear
mirivlad, знаю как это решали другие... вощем при первом открытии картинки картинка заливаеться тебе на сервак дабы ускорить скорость остальных открытий... стоит на каждую картинку таймер к примеру на 3 для... по истичению 3 дней картинка стирается...но если на картинку хотябы раз в день бывает запрос таймер автоматически продливается ещё на один день. ну и там еше и проверка url стоит... которая проверяет есть ли воще картинка по данному адрессу...если нет выводиться своя... картинка отсуцтвует...ну или ч то то типо того. это решение проблемы стоит на www.germany.ru
Нужно сказать огромное спасибо людям, которые живут на популярных девелопер форумах и дают там адекватные ответы на абсолютно «нубские» вопросы без попыток унизить вопрошающего.
 
mirivlad
edmonsur написал:

mirivlad, знаю как это решали другие... вощем при первом открытии картинки картинка заливаеться тебе на сервак дабы ускорить скорость остальных открытий... стоит на каждую картинку таймер к примеру на 3 для... по истичению 3 дней картинка стирается...но если на картинку хотябы раз в день бывает запрос таймер автоматически продливается ещё на один день. ну и там еше и проверка url стоит... которая проверяет есть ли воще картинка по данному адрессу...если нет выводиться своя... картинка отсуцтвует...ну или ч то то типо того. это решение проблемы стоит на www.germany.ru

Это не везде будет корректно использовать. Данное решение имеет мааааленькую проблему, которая позже вырастет в большую. У меня например VDS сервер на SSD винте с 30 гигами места. Мне этого места катастрофически жалко. Увеличение доступно только при покупке другого ВДС. А вот канала и трафика мне не жалко - пускай гоняется. Главное чтобы медленные сервера не влияли на работу сайтов.
 
Web
Vova
Загрузить источник  GeSHi: PHP
  1. if (!function_exists("get_ctype_code")) {
  2. function get_ctype_code($URL) {
  3. $headers = get_headers($URL);
  4. $state[1] = substr($headers[0], 9, 3);
  5. $state[2] = substr($headers[3], 13, 11);
  6. return $state;
  7. }
  8. }
  9. $query = get_ctype_code($matches[1].$matches[3].$matches[4]);
  10. if (!empty($query) && ($query[1] == "200")) {
  11. print_r($query);
  12. }
Добавлено за 0.042 секунд, используя GeSHi 1.0.8.10


Так проще. Не помню что быстрее curl, get_headers, fopen.

Тестанул на картинке 8мб размером 5500 на 3000. Вроде быстро.
Изменил(а) Vova, 01.11.2013 09:40
 
Web
SchreiBear
mirivlad, ну к примеру ...как ты выше написал возникает вариант с словом timeout то можно использовать мной приведёное решение в противном случии всё остается как есть... просто втыкнуть перемычьку и все... как дополнение к фьюженскому стандарту
 
Polarfox
реализацию покажи, я знаю что ббкод ущербен в плане обработки, нельзя ставить ничего кроме статики, твоя очередь.
Всегда делайте backup перед изменениями | Указывайте свою версию в подписи/профиле. | Вся бесплатная тех. поддержка только на форуме
 

Поделиться этой темой
Социальные закладки: Vkontakte Odnoklassniki Mail.ru Facebook Google Tweet This
URL:
BBcode:
HTML:

Перейти на форум:
Похожие темы
Топ 5 пользователей форума
Zaxap Zaxap (1,090)   Vova Vova (877)   Pisatel Pisatel (678)   util util (666)   SchreiBear SchreiBear (625)