Как стать автором
Обновить

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

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

Из достоверных источников (логов) было известно, что не хватает памяти для копирования изображения в оную. Т.е. нужно было предварительно проверить её достаточное наличие перед использованием библиотеки (вариант манипуляция с 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.
Теги:
Хабы:
Всего голосов 10: ↑8 и ↓2+6
Комментарии3

Публикации

Ближайшие события