Почему PHP выделяет слишком много памяти, чем загруженное изображение?

#php #gd

#php #gd

Вопрос:

Я выполнил следующий PHP-код:

 $a = memory_get_usage();
$b = memory_get_usage(true);
echo $a.' bytes ('.($a/1024/1024).' MB), '.$b.' bytes ('.($b/1024/1024).' MB)<br>';

$img = imagecreatefromjpeg('image.jpg');

$a = memory_get_usage();
$b = memory_get_usage(true);
echo $a.' bytes ('.($a/1024/1024).' MB), '.$b.' bytes ('.($b/1024/1024).' MB)';
  

Размер изображения 8.8 MB зависит от разрешения 8185 x 5787 .

Результат был следующим:

 396168 bytes (0.37781524658203 MB), 2097152 bytes (2 MB)
190081952 bytes (181.27627563477 MB), 127926272 bytes (122 MB)
  

Как видно, до загрузки изображения использование памяти PHP / script было только 0.3778.. MB (или максимальным 2 MB ), но после загрузки изображения 8.8 MB использование памяти увеличилось в 181 MB ( 181 / 8.8 = 20.57 раз больше, чем изображение)!

Почему PHP использует слишком много памяти, чем загруженное изображение? Понятно, что использовать от 2 до 5 раз, но 20,57 раза не кажется слишком большим?


И еще одна вещь, это то, что документация PHP memory_get_usage([ bool $real_usage = FALSE ] ) : int говорит об этом параметре:

Если не установлено или FALSE, сообщается только об используемой памяти. Установите для этого значение TRUE, чтобы получить общую память, выделенную из системы, включая неиспользуемые страницы.

Я нахожу это запутанным. В первой строке вывода используемая память является 0.3778 MB , а общая память, выделенная из системы, равна 2 MB , что кажется нормальным. Но во второй строке вывода используемая память является 181 MB , а общая память, выделенная из системы, равна 122 MB . Как общая память может быть меньше используемой памяти?

Комментарии:

1. Вы можете попробовать ImageMagick вместо GD.

2. @IVOGELOV Спасибо. Я попробовал Imagick (ImageMagick), изменив 5-ю строку кода на $img = new Imagick('image.jpg'); , и результат показывает: 392128 байт (0,37396240234375 МБ), 2097152 байта (2 МБ) и 392192 байта (0,3740234375 МБ), 2097152 байта (2 МБ) для того же изображения размером 8,8 МБ! Теперь PHP даже не занимает память, эквивалентную изображению, это действительно [image] magic! 😀