быстрее fopen или file_get_contents? - PullRequest
11 голосов
/ 18 октября 2011

У меня несколько сайтов с большим трафиком, по требованию все изображения загружаются через image.php?id=IMAGE_ID_HERE.Если вы когда-либо делали это раньше, вы знаете, что этот файл будет считывать образ файла и отображать его в браузере со специальными заголовками.

Моя проблема в том, что нагрузка на сервер очень высокая (150-200) и команда TOP показывает несколько экземпляров image.php, поэтому image.php работает медленно!

проблема, вероятно, заключается в fopen загрузке изображения в память перед отправкой его клиенту.Как прочитать файл и передать его напрямую?

Спасибо, ребята


ОБНОВЛЕНИЕ

После того, как вы оптимизировали код, использовали кешированиевезде, где это возможно, создайте CDN.пара серверов, методы синхронизации, балансировщики нагрузки и больше не нужно беспокоиться о запросах:)

Ответы [ 2 ]

16 голосов
/ 18 октября 2011

fopen и file_get_contents почти эквивалентны

для ускорения загрузки страницы, которую вы можете использовать

http://www.php.net/fpassthru

или, еще лучше

http://www.php.net/readfile

с этими функциями содержимое файла печатается напрямую, байт на байт

в отличие от file_get_contents, например, где вы храните все данные внутри переменной

$var = file_get_contents();

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

надеюсь, это поможет!

4 голосов
/ 18 октября 2011

Почему вы не кэшируете содержимое изображения с помощью apc?

if(!apc_exists('img_'.$id)){
    apc_store('img_'.$id,file_get_content(...));
}

echo apc_fetch('img_'.$id);

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

...