Pull to refresh

Особенности использования GD-lib на хостинге PHP c ограничеными ресурсами

Reading time2 min
Views798
Данной проблемой пришлось занятся после случая на хостинге «Х», на котором достаточно небольшие изобржаения невозможно было преобразовать, используя эту библиотеку. Но самое противное заключалось в том что скрипт просто умирал, оставляя информацию только в логах. Поэтому пришлось выяснить

Из достоверных источников (логов) было известно, что не хватает памяти для копирования изображения в оную. Т.е. нужно было предварительно проверить её достаточное наличие перед использованием библиотеки (вариант манипуляция с memory_limit не рассматривается), предугадав при этом сколько же она собирается этой памяти прихватить.

Итак, библиотека GD может создавать изображения с палитрой 2^8 цветов и 2^24. Т.ж. теоритически максимальный размер изображения 2^16 x 2^16. Итого на пиксел приходится 5 или 7 байт.

Проверим на практике — создадам квадратные изображения функциями createImage и createImageTrueColor. И сведем практику и теорию в одном графике:



Видно что результаты расходятся, но при этом практически совпадают теория для 8 бит и практика для 24 бит.

Попробуем получит эмпирические значения «средних затрат памяти» на 1 пиксел в двух палитрах. Строим графики.



Видно что при больших значених они асимптотически стремятся к 2-м и 5-ти байтам соответствено.

Но при малых размерах картинки (примерно 100 пкс на сторону) могут достигать 3-х и 6-ти байт на пиксел. Не будем заморачиваться на апроксимирующую функцию (хотя стоило бы) и просто возьмем среднее 2,5 и 5,5 байт на пиксел соответственно.

Как результат получаем следующую функцию проверки возможности использования библиотеки GD в текущей опреативной обстановке:

Copy Source | Copy HTML
  1. function returnBytes($v) {
  2.        $v = trim($v);
  3.        switch(strtolower($v[strlen($v)-1])) {
  4.            case 'g':
  5.                $v *= 1024;
  6.            case 'm':
  7.                $v *= 1024;
  8.            case 'k':
  9.                $v *= 1024;
  10.        }
  11.        return $v;
  12.     }
  13.  
  14.  
  15. function checkMemoryForGDUsage($w, $h, $trueColor = false){
  16.         return (((returnBytes(ini_get("memory_limit"))-memory_get_usage())) > ($w * $h * (2.5 + (((int)$trueColor) * 3))))?true:false;
  17.     }


Собственно все, теперь вызов функции checkMemoryForGDUsage c планируемыми значениями ширины, высоты и палитры, перед созданием изображения, может уберечь (при удачном стечении обстоятельств) от fatal error.
Tags:
Hubs:
+6
Comments3

Articles