способы вывода картинки на странице

mcfalu

Новичок
способы вывода картинки на странице

У меня вот такой вопрос: есть скрипт который на выходе выводит картинку. image.php
потом я вставляю путь к данному скрипту в теге img

<img src="sitename.com/image.php?img_name=IMAGE1.jpg" /> и получаю картинку

вот часть скрипта
...
//Получаем с базы путь к файлу с именем=IMAGE1.jpg

header("Content-Type: ".$mimeType);

$fp = fopen($pathToFile, 'rb'); //Читаем в переменную файл

fpassthru($fp);//Отдаем браузеру

все нормально, но меня интересует насколько этот способ с использованием fopen эффективен если к примеру на его основе писать галерею, которая будет с большим количеством посещений, соответственно каждый раз картинку нужно выводить через скрипт, таким образом нагружая сервер

чем будет отличается вывод файла через fopen()+fpassthru() от readfile().

можно стандарным образом без всякого скрипта выводить
<img src="sitename.com/IMAGES/FOLDER_NAME/FOLDER_NAME/IMAGE1.jpg" />

но проблема в том, что нужно скрывать реальный путь к файлу.

можно через mod_rewrite задать правило редиректа.

Если коротко, меня интересует какой способ более эффективен с точки зрения нагрузки на сервер
 

mcfalu

Новичок
если путь к файлу к примеру такой вот

SITENAME.COM/IMAGES/FOLDER_1/FOLDER_2/FOLDER3/...../FOLDER_N/IMAGES1.jpg

а мне нужно в ссылку в таком виде
SITENAME.COM/GET_IMAGE/IMAGES1.jpg

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

Фанат

oncle terrible
Команда форума
суть как раз в зачем.
какая разница, какой путь?
 

mcfalu

Новичок
ладно, давайте так
мне нужно выводить картинки через скрипт PHP - каким образом это эффективнее с точки зрения нагрузки на сервере сделать?

зачем - к примеру чтобы подсчитывать количетсво просмотров данной картинки
 

Фанат

oncle terrible
Команда форума
эффективнее - не показывать картинки через скрипт PHP
по-моему, это очевидно

-~{}~ 21.01.09 12:06:

и давайте без "давайте так".
 

Активист

Активист
Команда форума
*****,
Есть предположение, что назначение сайта - продажа картинок.

-~{}~ 21.01.09 12:42:

Порно)
 

x-yuri

Новичок
меня интересует какой способ более эффективен с точки зрения нагрузки на сервер
а ты сравни, можешь даже свои выводы сообщить

считать количество просмотров можно и через журнал сервера

чем будет отличается вывод файла через fopen()+fpassthru() от readfile()
в любом случае не вижу смысла писать две строчки, если можно одну. Кроме того, надеюсь readfile не считывает весь файл, а только потом выводить его начинает, думаю он по частям это делает
 

dimagolov

Новичок
x-yuri, твои надежды беспочвенны и надеешься ты на невозможное.
 

x-yuri

Новичок
x-yuri, твои надежды беспочвенны и надеешься ты на невозможное.
я просто подумал, что если функция просто выводит файл, то ей незачем его весь в память мэпить, а потом уже выводить. Ты часом не знаешь ответа на вопрос?
Хотя, конечно, есть второй фактор - output_buffering, но он второй
 

dimagolov

Новичок
x-yuri, у тебя есть 2 выхода:
1. посмотреть в сишных исходниках реализацию readfile
2. поставить memory_get_peak_usage после readfile и смотреть зависимость результата от размера файла.
 

antson

Новичок
Партнер клуба
имхо все остальное мелочи.
//Получаем с базы путь к файлу с именем=IMAGE1.jpg
А вот , если за этой фразой скрывается обращение
к MySQL сервер в большой заднице окажется.
 

dimagolov

Новичок
x-yuri, файл-то читается блочно, но вот его вывод падает в память и живет там до окончания скрипта (или сброса буффера вывода в апач), что не может произойти до окончания полного чтения файла. как результат, все содержимое файла перед отдачей клиенту оказывается в памяти.
 

x-yuri

Новичок
x-yuri, файл-то читается блочно
в какой версии? В 5.2.8, если есть возможность, он мэпится в память. Видимо, чтобы несколько процессов не грузили один и тот же файл в память.

Память под мэппинг, думаю, не учитывается в memory_limit, а превышение лимита или неразумное расходование памяти, да, происходит из-за накопления информации в буфере.

Кстати, по идее, ini_set('implicit_flush') должно было бы заставить readfile и fpassthru сбрасывать буфер, но в случае мэппинга сброс происходит после вывода всего файла, в отличие от случая его отсутствия
 

dimagolov

Новичок
x-yuri, не суть важно, если клиент не успевает читать поток (а это почти всегда, так как чтение с диска всегда быстрее канала пользователя), то или скрипт будет висеть и ждать клиента, или скрипт с php отработают и все что они выплюнули повиснет в памяти у апача пока клиент не вычитает его. то есть что в лоб, что полбу, если скрипт читает файл одним куском, то у него нет иной перспективы, чем повиснуть а памяти сервера до полной отдачи юзеру.
 

x-yuri

Новичок
dimagolov подожди, ты себе противречишь

ты говоришь, что один из вариантов - "скрипт будет висеть и ждать клиента". По какой причине? Очистка буфера будет приостанавливать скрипт, пока содержимое буфера не будет принято клиентом? Тогда весь файл не будет висеть в памяти, только текущий кусок. Значит особого расхода памяти не будет

Если же в случае медленного клиента весь файл в результате окажется в памяти (т.е. скрипт висеть не будет), тогда апач, по идее, может рациональнее отдавать файл клиенту - дожидаться, когда он приймет текущий кусок и после этого отдавать следующий

какой вариант верный или где ошибка?
 

dimagolov

Новичок
если не используется ob_, то исполнение скрипта приостанавливается, пока клиент не выбрал буфер апача.

а если используется, то соответственно скрит отрабатывает быстро, но вывод висит в памяти, пока не будет запрошен клиентом.
 

x-yuri

Новичок
если не используется ob_, то исполнение скрипта приостанавливается, пока клиент не выбрал буфер апача.
насколько я понял "не используется ob_" = "настройка output_buffering = off"
так тогда получается, что нету особой разницы между потоком апача, который отдает файл и php-скриптом, выполняющим ту же задачу. Оба будут висеть пока клиент не получит файл, и память при этом особо расходоваться не будет
 

antson

Новичок
Партнер клуба
x-yuri
зато в памяти будет висеть пхп.

отдача графики в порядке снижения быстродействия

ngnix,LightHttpd
apache (с отключенными всеми феньками)
разрешили переопределение htaccess
разрешили и задействовали реврайт
включили в логах ip ресовинг

начали отдавать графику через пхп

в этом скрипте еще работаем с субд.


и ломаем копья в разнице которая меньше 1%
 
Сверху