Данной проблемой пришлось занятся после случая на хостинге «Х», на котором достаточно небольшие изобржаения невозможно было преобразовать, используя эту библиотеку. Но самое противное заключалось в том что скрипт просто умирал, оставляя информацию только в логах. Поэтому пришлось выяснить
Из достоверных источников (логов) было известно, что не хватает памяти для копирования изображения в оную. Т.е. нужно было предварительно проверить её достаточное наличие перед использованием библиотеки (вариант манипуляция с 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 в текущей опреативной обстановке:
Собственно все, теперь вызов функции checkMemoryForGDUsage c планируемыми значениями ширины, высоты и палитры, перед созданием изображения, может уберечь (при удачном стечении обстоятельств) от fatal error.
Из достоверных источников (логов) было известно, что не хватает памяти для копирования изображения в оную. Т.е. нужно было предварительно проверить её достаточное наличие перед использованием библиотеки (вариант манипуляция с 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
- function returnBytes($v) {
- $v = trim($v);
- switch(strtolower($v[strlen($v)-1])) {
- case 'g':
- $v *= 1024;
- case 'm':
- $v *= 1024;
- case 'k':
- $v *= 1024;
- }
- return $v;
- }
-
-
- function checkMemoryForGDUsage($w, $h, $trueColor = false){
- return (((returnBytes(ini_get("memory_limit"))-memory_get_usage())) > ($w * $h * (2.5 + (((int)$trueColor) * 3))))?true:false;
- }
Собственно все, теперь вызов функции checkMemoryForGDUsage c планируемыми значениями ширины, высоты и палитры, перед созданием изображения, может уберечь (при удачном стечении обстоятельств) от fatal error.