@JohnDidact
Нуб во всём

Значительна ли разница между отдачей изображений напрямую и отдачей изображений через скрипт?

Есть сайт... Пользователь загружает на сайт изображения - аватарки в профиль, превьюшки к темам на форуме. Скрипт принимает изображение и конвертирует его в 3 вида. В основном вид зависит от размера, но на некоторые добавляется прозрачный фон для сохранения, увеличения или уменьшения соотношения сторон. 4 изображения (конвертированные и оригинал) храню в разных категориях с одинаковым именем. Изображение доступно по ссылке https://i.example.com/?t=1&f=example-image112232.jpeg где t - тип изображения (маленькое, среднее, большое), f - имя изображения.

Изображения конвертируются довольно быстро, но на всякий случай сделал так, что если просят изображение, которое ещё не прошло конвертацию, отдаю изображение "по умолчанию", которое своим видом говорит, что изображение конвертируется (конвертирую через GD в CLI).

Изображение отдаю так:
header('Cache-Control: public,max-age=31536000,only-if-cached');
header('Content-Type: '. $_Image->img['mime']); // $_Image->img['mime'] - Mime-тип изображение, вычисляю функцией getImageSize()
header('Date: '. date('D, d M Y H:i:s') .' GMT');
header('Etag: JohnDidact_Image_'. $_Image->img['name']);
header('Last-Modified: '. $_Image->img['last_modified']); // $_Image->img['last_modified'] - Время крайнего изменения (создания) изображения, вычисляю функцией fileMTime()
header('Content-Disposition: inline; filename='. $filename);  // имя файла тоже вычисляется: название сайта + кусок имени оригинала + расширение файла.
echo file_get_contents($img_src);  // вывожу байты из локального файла (изображение)


Я довольно жадный параноик, поэтому мне жалко и страшно отдавать таким способом изображение. Следовательно вопрос, много ли грузит сервер такой метод отдачи файлов? На много ли ресурсоёмок этот метод, по сравнению с обычной отдачей файла сервером? Я читал много по этому поводу, но не достаточно. Хотелось бы просто получить содержательный ответ... Спасибо.
  • Вопрос задан
  • 1194 просмотра
Решения вопроса 2
@bacon
file_get_contents в память же грузит? Пример, приходит 100 запросов, где надо отдать в каждом 10М - значит минимум 1Г ОЗУ (это не считая сколько каждый php процесс занимает), плюсом пока файл не будет отдан, будет занят php процесс и память не освободиться, т.е при медленных соединениях, другие php запросы, будут ожидать в очереди на обработку, а память будет занята продолжительное время.

Nginx умеет отдавать файлы асинхронно и не загружая их полностью в память.
Ответ написан
@bagadjan
Я пользуюсь таким способом: гружу картинку в оригинале на хост, при запросе уменьшеной картинки по адресу site/img/small/filename.jpg в htaccess делаю переадресацию на php скрипт, который делает resize и сохраняет по адресу site/img/small/filename.jpg
При повторных запросах php скрипт уже не выполняется и отдаётся оригинальная картинка

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^img/small/(.+) resize/resize.php?file=$1
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
если очень надо через скрипт - readfile() более подходящая альтернатива. В остальном правильнее отдавать файлы напрямую.
Ответ написан
@AlexBergal
Возможно стоит посмотреть в сторону
header("X-Accel-Redirect: /img.jpg");
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы