Более быстрый способ чтения и вывода изображений в браузере с помощью PHP

Я читаю изображения с минимума 1x1 максимум до пикселя 1600x1600 пиксели. Я написал три PHP-метода и отлично работаю.

// using FGC
function output_fgc($filename)
{
    header("Content-Type: image/png");
    echo file_get_contents($filename);
}

// using fopen
function output_fp($filename)
{
    $handle = fopen($filename, 'rb');

    header("Content-Type: image/png");
    header("Content-Length: " . filesize($filename));

    fpassthru($handle);
}

// using GD
function output_gd($filename)
{
    $im = imagecreatefrompng($filename);

    header('Content-Type: image/png');

    imagepng($im);
    imagedestroy($im);
}

Кажется, производительность одинакова для всех методов. Просто хотите узнать, кто использует больше ресурсов сервера? Есть ли лучшие методы, чем это? Заранее спасибо.

1 ответ

Решение

Когда пользователь запрашивает изображение-заполнитель размером 200x100 пикселей, в первый раз создайте его с помощью GD, Save and Output, в следующий раз, если запрашивается такой же размер, я просто читаю сохраненный файл и выводлю его в браузер, вместо этого снова создавая новый.

Если вы можете использовать модуль Apache mod_rewrite, есть еще более эффективный подход, который вообще не требует PHP после создания изображения. См. Создание кеша измененных изображений, но предотвращение злоупотреблений

Украдено оттуда:

HTML:

<img src="images/cache/200x150-picture_001.jpg" />

.htaccess код:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ images/image.php?f=$1 [L]

Этот метод проверяет, существует ли изображение правильного размера / имени файла в папке "cache", и только если этого не происходит, он вызывает ваш скрипт PHP. Ваш скрипт должен анализировать информацию о размере (например, 200x100 как вы говорите), измените размер и выведите изображение. В следующий раз, когда кто-то запросит изображение, Apache будет обслуживать его статически, сохраняя ресурсы в процессе.

Единственным недостатком этого является то, что скрипт PHP будет вызываться только один раз, поэтому, если исходное изображение изменится, это изменение никогда не будет распространено на версию с измененным размером. Вам может потребоваться время от времени стирать все изображения с измененным размером, чтобы предотвратить это, или удалять все изображения с измененным размером, если оригинал изменяется.

Также обязательно отправляйте информацию о кешировании при выводе изображения с помощью PHP. Смотрите, например, Как использовать заголовки кеша HTTP с PHP

Использовать readfile($filename). Это лучший вариант для чтения любого файла на php.

function output_rf($filename)
{
    header("Content-Type: image/png");
    readfile($filename);
}
Другие вопросы по тегам