Рубрики
Uncategorized

PHP Обработка изображений с высоким разрешением

Автор оригинала: David Wong.

Сегодня мой маленький друг задал такой вопрос в группе:

Это происходит из-за нехватки памяти. PHP Программа завершает работу напрямую, и отчет об ошибке выглядит следующим образом:

Изображение выше означает, что максимальная память, которую мы можем использовать, составляет 8 М, но для обработки этого изображения требуется дополнительный 41 байт, что приведет к нехватке памяти. Это серьезная ошибка. Перед началом работы с изображением вся информация с изображения должна быть считана в память. В то же время использование другой части памяти совпадает с обработкой вычислений и кэшированием выходных данных, поэтому использование объема памяти по-прежнему связано с размером изображения.

PHP Используется обработка китайских картинок. GD Библиотека, эта библиотека предоставляет множество способов PHP для более удобного управления изображениями. Форматы поддерживаемых изображений следующие:

Возвращаясь к первоначальной проблеме, этот маленький партнер должен иметь дело с изображениями с высоким разрешением. Размер изображений обязательно будет большим, поэтому памяти будет недостаточно. Есть еще много решений.

1. Установите максимальный загружаемый размер изображения

Интерфейс может определить размер перед загрузкой. Если он превышает максимальное значение, он не будет запрашивать интерфейс напрямую. В то же время, в целях безопасности серверная часть также должна определить размер после получения запроса, чтобы предотвратить аварийный выход программы.

2. Сжатые изображения

3. Закрытие memory_limit

Мелкие партнеры в группе наконец-то воспользовались одним из них. Простой и грубый способ Решить эту проблему и отключить ее непосредственно в PHP memory_limit :

 set_time_limit(0);
@ini_set('memory_limit','-1');

Это решает проблему, но это не элегантно и не безопасно. Это одно и то же. php .ini В файле конфигурации memory_limit Установка большого значения также может решить проблему ____________

memory_limit = 256M

Это также может быть задано в PHP-коде:

ini_set('memory_limit', '256M');

Выше мы будем memory_limit Фиксированные параметры, что приносит недостаток, потому что в большинстве случаев не требуется такой большой объем памяти, небольшая трата ресурсов, лучший способ-установить в соответствии с потребностями. memory_limit Я написал следующий метод для справки:

public function setMemoryLimit($filename){
    // Control execution time
    set_time_limit(50);

    $maxMemoryUsage = 256M;
    $width = 0;
    $height = 0;
    $size = ini_get('memory_limit');

    // Get picture size
    list($width, $height) = getimagesize($filename);

    // Calculate the required memory and convert it into'M'units
    // 4 because a PNG picture has 4 bytes per pixel
    // 1.5 is an adjustment factor because memory_limit is not so precise
    // Details can be found at http://php.net/image creation from jpeg#76968
    $size = $size + floor(($width * $height * 4 * 1.5 + 1048576) / 1048576);

    if ($size > $maxMemoryUsage){
        $size = $maxMemoryUsage;
   }

   // Update
   ini_set('memory_limit',$size.'M');
}

Наконец, скажите это онлайн. GD Библиотеки требуют много памяти, но я не тестировал их здесь. Есть один на Github. C Проект называется libvips/libvips :

Это может повысить скорость обработки изображений, не занимая много памяти. Часть 2: https://github.com/libvips/li… у него есть время, чтобы учиться.