Получение изображения с помощью PHP

#php #image

#php #изображение

Вопрос:

Плохая ли практика извлекать изображения таким образом? У меня есть страница для вызова этого скрипта около 100 раз (там 100 изображений). Могу ли я вызвать перегрузку сервера или слишком много http-запросов или что-то еще? У меня проблемы с сервером, и я не знаю, является ли это причиной этого: (

 // SET THE CONTENT TYPE HEADER
header('Content-type: image/jpeg');

// GET THE IMAGE TO DISPLAY
$image = imagecreatefromjpeg( '../path/to/image/' . $_SESSION[ID] . '/thumbnail/' . $_GET[image]);

// OUTPUT IMAGE AND FREE MEMORY
imagejpeg($image);
imagedestroy($image);  
  

Я вызываю скрипт из обычных тегов. Причина, по которой я вызываю их через PHP, заключается в том, что изображения являются частными для пользователя.

Любая помощь с благодарностью!!

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

1. Система защиты серверов от ddos-атак сработала и заблокировала меня. Но readfile() также был важным моментом!

Ответ №1:

С помощью этого вы :

  • Чтение содержимого файла
  • Преобразование этого содержимого в изображение в памяти
  • Повторный рендеринг этого изображения

Если вы просто хотите отправить изображение (которое у вас есть на диске) своим пользователям, почему бы просто не использовать readfile() вот так :

 header('Content-type: image/jpeg');
readfile('../path/to/image/' . $_SESSION[ID] . '/thumbnail/' . $_GET[image]);
  

При этом вы просто :

  • Прочитайте файл
  • и отправка его содержимого

Без преобразования его в изображение — устранение некоторых бесполезных вычислений в процессе.

В качестве дополнительного примечания: вам не следует использовать $_GET[image] подобное в вашем path : вы должны убедиться, что через этот параметр не вводятся вредоносные данные!

В противном случае любой пользователь потенциально сможет получить доступ к любому возможному файлу на вашем сервере… им просто нужно указать некоторый относительный путь в image параметре…

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

1. Спасибо, я заменю свой код на readfile вместо этого 🙂 Что касается соображений безопасности, я только что опубликовал упрощенную версию кода, но в любом случае спасибо!! Отличная помощь 🙂

2. @Mathias: Приведенный выше пример не более безопасен, чем ваш. По крайней мере, примените basename() к параметру $_GET.

3. @mario на самом деле это не более безопасно, поскольку я просто скопировал путь, который он использовал, без добавления какой-либо дополнительной проверки — вот почему я добавил примечание, связанное с безопасностью, в конце моего ответа (даже если это не связано с вопросом, я чувствовал, что это не повредит) ;; Видя комментарий Матиаса, я думаю, что его код более безопасен, но он не опубликовал информацию о проверке (по крайней мере, я на это надеюсь)

Ответ №2:

Да, это очень плохо. Вы декодируете файл .jpg в растровое изображение на основе памяти (которое «огромно» по сравнению с исходным двоичным файлом .jpg. Затем вы повторно сжимаете растровое изображение в формат jpeg.

Таким образом, вы тратите кучу

а) память
б) процессорное время
в) потеря еще большего качества изображения, потому что jpg — формат с потерями.

почему бы просто не сделать:

 <?php
header('Content-type: text/jpeg');
readfile('/path/to/your/image.jpg');
  

вместо этого?

Ответ №3:

Чтобы ответить на два конкретных вопроса из вашего вопроса

Могу ли я вызвать перегрузку сервера или слишком много http-запросов или что-то еще?

да, конечно.
как с помощью многочисленных HTTP-запросов, так и с помощью обработки изображений.
Вам нужно уменьшить количество изображений и реализовать некоторую разбивку на страницы, чтобы показывать изображения в меньших пакетах.
Вы также можете реализовать некоторые функции условного получения, чтобы уменьшить пропускную способность и нагрузку.
Если ситуация продолжает ухудшаться, и вам нужно распорядиться некоторыми ресурсами, подумайте об установке какого-нибудь прокси для распространения контента. nginx с заголовком X-Accel-Redirect является распространенным примером

У меня проблемы с сервером, и я не знаю, является ли это причиной этого: (

Тогда вам не следует снимать в темноте. Сначала создайте профиль своего сайта.