Я всегда понимал, что обработка изображений с использованием 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 иметь такую разницу?
Тогда я понял, что странно, что мой сценарий разработки, похоже, способен обрабатывать 16M изображение, используя только 1M памяти.Я думаю, что это возможно при эффективном использовании памяти, но я не уверен, что именно так работает GD.Что-то не так в моем тестовом примере?
Я проверил значение ini_get('memory_limit')
после его установки, и оно говорит 1M, так что, похоже, это правильно.
Есть мысли по этому поводу?