Использование памяти PHP GD очень низкое VS очень высокое

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

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

Да, хорошо, но будет ли это иметь такое большое значение в использовании памяти?

vrijdenker 02.02.2019 15:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Какая ОС кстати...?

Vinay 06.02.2019 16:59

Центос и FreeBSD

vrijdenker 06.02.2019 17:00

Другие вопросы по теме