Более быстрый способ чтения и вывода изображений в браузере с помощью 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);
}