#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 является распространенным примером
У меня проблемы с сервером, и я не знаю, является ли это причиной этого: (
Тогда вам не следует снимать в темноте. Сначала создайте профиль своего сайта.