Я всегда понимал, что обработка изображений с помощью GD занимает довольно много памяти. Однако на наших производственных серверах я обнаружил, что объем используемой памяти был слишком большим, поэтому я углубился в код, чтобы посмотреть, смогу ли я внести хотя бы некоторые улучшения.
Во время отладки я не получил ожидаемых результатов, поэтому вместо этого я создал небольшой тестовый скрипт, который меня озадачил. Я надеюсь, что у кого-то есть новые идеи по этому поводу.
Сценарий представляет собой простой сценарий для тестовых целей:
<?php
ini_set('memory_limit', '1M');
$src = __DIR__ . '/../images/image-15M.jpg';
$dest = __DIR__ . '/../images/output/resized-image-15M.jpg';
@unlink($dest);
list($srcWidth, $srcHeight, $srcType) = getImageSize($src);
$destImage = imageCreateTrueColor(1000, 1000);
$srcImage = imageCreateFromJpeg($src);
imageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, 1000, 1000, $srcWidth, $srcHeight);
imageJpeg($destImage, $dest, 80);
if (file_exists($dest)) {
die('Image created succesfully in output-directory');
}else{
die('Failed creating image');
}
Теперь, как вы можете видеть в этом сценарии, я установил ограничение памяти на 1 МБ. Скрипт по-прежнему работает нормально. На рабочем сервере сценарию не хватает памяти, как и ожидалось.
Теперь я также проверил это с изображением размером 500 КБ. Он отлично работает в моей среде разработки, но на рабочем сервере для его работы требовалось до 16 МБ.
Мой первый вывод заключался в том, что на рабочем сервере что-то не так. Основное отличие (на самом деле отличий много, включая ОС), которое мне показалось важным, — это разница в GD:
Разработка:
'GD Version' => '2.2.5',
'FreeType Support' => true,
'FreeType Linkage' => 'with freetype',
'T1Lib Support' => true,
'GIF Read Support' => true,
'GIF Create Support' => true,
'JPEG Support' => true,
'PNG Support' => true,
'WBMP Support' => true,
'XPM Support' => true,
'XBM Support' => true,
'WebP Support' => true,
'JIS-mapped Japanese Font Support' => false,
Производство:
'GD Version' => 'bundled (2.1.0 compatible)',
'FreeType Support' => true,
'FreeType Linkage' => 'with freetype',
'T1Lib Support' => true,
'GIF Read Support' => true,
'GIF Create Support' => true,
'JPEG Support' => true,
'PNG Support' => true,
'WBMP Support' => true,
'XPM Support' => false,
'XBM Support' => true,
'WebP Support' => false,
'JIS-mapped Japanese Font Support' => false,
Будет ли комплектная версия GD иметь такое значение?
Затем я понял, что странно, что мой сценарий разработки может обрабатывать изображение размером 16 МБ, используя только 1 МБ памяти. Я думаю, что это возможно при эффективном использовании памяти, но я не уверен, что так работает GD. Что-то не так в моем тестовом примере?
Я проверил значение ini_get('memory_limit') после его установки, и оно говорит 1M, так что это кажется правильным.
Есть мысли по этому поводу?






Я только что нашел ответ сам. Я уже нашел этот отчет об ошибке, но недостаточно внимательно прочитал последний комментарий: https://bugs.php.net/bug.php?id=71093
Разница в потреблении памяти заключается в том, что связанная версия GD использует память, выделенную для PHP, а версия GD для ОС использует собственную память.
Я все еще нахожу это интересным, хотя я мог бы значительно снизить memory_limit PHP.
Какая ОС кстати...?
Центос и FreeBSD
Да, хорошо, но будет ли это иметь такое большое значение в использовании памяти?