Есть ли функция быстрее, чем fopen ()? - PullRequest
2 голосов
/ 10 ноября 2009

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

  1. Мы сохраняем путь к этому изображению в базе данных и получаем изображение
  2. Сохраните только имя (уникальное) изображения и используйте fopen (), поскольку мы сохраняем все загруженные изображения в одной папке

Теперь мой вопрос:

Какие существуют варианты получения этого файла вместо fopen ()? То есть, есть ли что-нибудь еще быстрее, чем это?

Ответы [ 6 ]

6 голосов
/ 10 ноября 2009

Вам не нужно использовать fopen для отображения галереи. Почему вы не можете просто показать такие картинки:

<img src="/folder/with/your/images/<?php echo $unique_name; ?>" />

0 голосов
/ 10 ноября 2009

Сколько изображений в вашей загруженной папке?

  • Если у вас их тысячи, рассмотрите возможность уменьшения папок.
  • Например, система terminfo использует подкаталог / usr / share / lib / terminfo / a / для хранения записей, начинающихся с «a».
  • Система CPAN для Perl использует авторов / id / A / AB / ABRAHAM для разделения.

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

Была статья или дискуссия по этому поводу - я думаю, что это было в «1013 * искусстве программирования Unix» Эрика Рэймонда , но в нем упоминались некоторые статьи, где проводились измерения - и это может дать ценные ускорения при минимальных затратах на программирование.

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

0 голосов
/ 10 ноября 2009

Если ваш веб-сервер lighttpd или Apache с mod_xsendfile , то вы можете отправить файл, указав специальный заголовок X-Sendfile. Это позволяет веб-серверу совершать вызов sendfile, что может быть очень и очень быстрым.

Причина в том, что sendfile обычно представляет собой оптимизированный вызов ядра, который может брать биты из файловой системы и напрямую помещать их в сокет TCP.

0 голосов
/ 10 ноября 2009

Для максимальной скорости сохраняйте файл на RAM-диске.

Подробнее tmpfs .

0 голосов
/ 10 ноября 2009

Я думаю, что readfile () будет лучше?

0 голосов
/ 10 ноября 2009

Не знаю, быстрее ли это, но file_get_contents () более лаконично. Для двоичного файла, такого как изображение, вы, вероятно, захотите использовать флаг FILE_BINARY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...