Быстрее fopen или file_get_contents?
Я запускаю несколько сайтов с высоким трафиком, как требование, все изображения загружаются через image.php?id=IMAGE_ID_HERE
.
Если вы когда-либо делали это раньше, вы знаете, что этот файл будет читать образ файла и повторять его в браузере со специальными заголовками.
Моя проблема в том, что загрузка на сервере очень высока (150-200), а команда TOP показывает несколько экземпляров image.php, поэтому image.php работает медленно!
проблема, вероятно, заключается в том, что fopen
загружает изображение в память перед отправкой его клиенту. Как прочитать файл и передать его напрямую?
Спасибо, ребята,
UPDATE
После того, как вы оптимизировали код, используйте кеширование, где это возможно, создайте CDN. пару серверов, методы синхронизации, балансировки нагрузки и больше не нужно беспокоиться о запросах:)
Ответы
Ответ 1
fopen и file_get_contents почти эквивалентны
чтобы ускорить согласованность загрузки страницы, которую вы можете использовать
http://www.php.net/fpassthru
или, даже лучше
http://www.php.net/readfile
с этими функциями, содержимое файла печатается напрямую, байт за байт
в отличие от file_get_contents, например, где вы храните все данные внутри переменной
$var = file_get_contents();
поэтому для правильной работы этих функций вам необходимо отключить буферизацию вывода (иначе это будет делать readfile() бессмысленным) на странице, которая обслуживает изображения
надеюсь, что это поможет!
Ответ 2
Почему вы не кэшируете содержимое изображения с помощью apc?
if(!apc_exists('img_'.$id)){
apc_store('img_'.$id,file_get_content(...));
}
echo apc_fetch('img_'.$id);
Таким образом, содержимое изображения не будет считываться с вашего диска более одного раза.