Использование памяти PHP GD очень низкое VS очень высокое - PullRequest
0 голосов
/ 02 февраля 2019

Я всегда понимал, что обработка изображений с использованием 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, так что, похоже, это правильно.

Есть мысли по этому поводу?

1 Ответ

0 голосов
/ 02 февраля 2019

Я только что нашел ответ сам.Я уже нашел этот отчет об ошибках, но я не прочитал последний комментарий достаточно хорошо: https://bugs.php.net/bug.php?id=71093

Разница в потреблении памяти заключается в том, что связанная версия GD использует память, выделенную для PHP, а версия ОС -GD использует свою собственную память.

Я все еще нахожу это интересным, хотя в этом я мог бы значительно уменьшить memory_limit в PHP.

...