Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ошибка imagecreatefromjpeg memory size [PHP]

312
19 октября 2008 года
dead_star
392 / / 26.11.2006
передача функции imagecreatefromjpeg() файла размером 67 Кб вызывает ошибку
Цитата:
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 6400 bytes)


если я правильно понимаю текст ошибки то передаваемый лимит 16 777 216 байт, а я передаю 6 400 байт что в разы меньше
не пойму в чем причина? ошибка возникает уже не первый раз
при чем, что самое смешное, файл размером 500 Кб функция обработала без вопросов
само изображение во вложении. настройки сервера:

Цитата:

memory_limit 16Mb
post_max_size 16Mb
upload_max_filesize 16Mb

12
19 октября 2008 года
alekciy
3.0K / / 13.12.2005
Цитата: dead_star
передача функции imagecreatefromjpeg() файла размером 67 Кб вызывает ошибку
если я правильно понимаю текст ошибки то передаваемый лимит 16 777 216 байт, а я передаю 6 400 байт:


Передавать то ты можешь и передаешься, только JPEG в расжатом видем занимает место в ОЗУ вразу большее, чем сам файл. Зависит от многих факторов, но вот для примера в одном из моих проектов при загрузке фоток на хостинг размером 2,5МБ, в ОЗУ при обработке эта же фота занимала 45МБ. Но это был крайний случае, обычно соотношение там было 1:10.

Поэтому выдаваемая ошибка правильно. Сказано, что лимит памяти превышен, значит так оно и есть.

P.S. А вот теперь догадайся, почему для фото хостингов берут выделенный сервер ;)

4
20 октября 2008 года
mike
3.7K / / 01.10.2002
Для обычного 32 битного изображения (цветной JPEG) посчитать размер картинки в распакованном виде можно по формуле ширина*высота*4+10% на накладные расходы.
312
20 октября 2008 года
dead_star
392 / / 26.11.2006
ва, это полная ж
мне как раз нужна активная работа с фото
12
20 октября 2008 года
alekciy
3.0K / / 13.12.2005
Цитата: dead_star
ва, это полная ж
мне как раз нужна активная работа с фото


Ну выход тогда очевиден: смена хостера или тарифного плана.

312
23 октября 2008 года
dead_star
392 / / 26.11.2006
возникла еще одна проблема

imagecreatefromjpeg() возвращает ошибку уровня E_ERROR (фотальная ошибка)
естественно мне это ненужно
необходимо как-то предупредить возникновение ошибки
в js есть схема try..catch, насколько я понимаю в php такой нет

вызов функции
 
Код:
function _create($file, $type){
  if (function_exists($type) && ($this->image=@$type($this->root.$file))){
   @chmod($this->root.$file, 0777);
   return $this->image;
  } else {
   return FALSE;
  }
 }

код должен предотвращать все ошибки,
но в некоторых случаях, когда возникает ошибка,
он все таки выдает Fatal error (если нет @) и прерывает работу кода
все что приходит в голову это юзать set_error_handler()
244
23 октября 2008 года
UAS
2.0K / / 19.07.2006
Цитата: dead_star
в js есть схема try..catch, насколько я понимаю в php такой нет


http://ru2.php.net/try

366
23 октября 2008 года
int
668 / / 30.03.2005
В php такая есть :)
312
23 октября 2008 года
dead_star
392 / / 26.11.2006


вот и у меня по воспоминаниям эта конструкция была, а в поиске по ману ее нет :(

244
23 октября 2008 года
UAS
2.0K / / 19.07.2006
dead_star, ну дык а что мешает использовать? Там в той статье все доходчиво написано что да как=) Куда пихать в код и как перехватывать=)
312
23 октября 2008 года
dead_star
392 / / 26.11.2006
спасибо все заработало
312
24 ноября 2008 года
dead_star
392 / / 26.11.2006
что-то оно опять перестало работать :(
видать опять что-то накрутил
вот мой код, тоже что и в мане
Код:
function _create($file, $type){
  // проверяю установлена ли функция
  if (!function_exists($type)) return FALSE;
  try {
   if ($this->image=@$type($this->root.$file)){ // здесь возникает ошибка которую не удается перехватить
    // если все отработало нормально открываю права на файл
    @chmod($this->root.$file, 0777);
   } else {
    // в случае ошибки возвращаю ее
    throw new Exception('Fatat error: excess memory size');
   }
  } catch (Exception $e){
   // в случае ошибки возвращаю FALSE
   return FALSE;
  }
  // если все успешно, возвращаю ссылку на объект картинки
  return $this->image;
 }
312
28 ноября 2008 года
dead_star
392 / / 26.11.2006
и все таки
откуда возникает эта ошибка мы разобрались
что с ней делать тоже
но я так и непонял как мне перехватить ошибку уровня E_ERROR
через try...catch не получается
вот такой вариант работает
 
Код:
try {
 throw new Exception('error');
} catch (Exception $e){
 echo $e->getMessage();
}

и даже такое работает
 
Код:
$a = 0;
try {
 if ($a){
  echo $a*10;
 } else {
  throw new Exception('error');
 }
} catch (Exception $e){
 echo $e->getMessage();
}

а так нет
 
Код:
try {
 if ($image=imagecreatefromjpeg($root.$file)){
  return $image;
 } else {
  throw new Exception();
 }
} catch (Exception $e){
 return FALSE;
}

ошибка возникает в условии обрубая работу кода накорню

и через set_error_handler не сделаешь,
так как handler обрабатывает ошибки только семейства E_USER
Цитата:
The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.



собственно говоря я через iframe загружаю рисунок на сервер и делаю ресайз через GD, а далее возвращаю результат в JS скрипт и отображаю результат на экране вполне естественно что меня не устраивает возникновение фатальной ошибки, которая не может ничего вернуть на страницу
но даже без этого. в обычной ситуации фатальная ошибка в GD при ресайзе изображения после загрузки означает что изображение не было полностью обработано и требует выбора другого файла для загрузки, а что же с тем файлом который мы уже загрузили но не смогли обработать. он теперь валяется как мусор на сервере и занимает место

312
29 ноября 2008 года
dead_star
392 / / 26.11.2006
решил попробовал посчитать по формуле предложенной mike
пока работает, хотя количество процентов на расходы пришлось увеличить до 25%
тестировал пока только на одной фотографии (2995х4500px 3157Kb)
сейчас буду активно тестировать на других
кстати, во время проверки выяснилось, что переопределение переменных занимает больше места в памяти
чем просто удаление и повторное определение той же переменной

для многих это естественно, но для меня это оказалось неожиданностью
вопрос об экономии системных ресурсов стал вполне актуальным
13
29 ноября 2008 года
RussianSpy
3.0K / / 04.07.2006
ну прям театр одного актера
312
30 ноября 2008 года
dead_star
392 / / 26.11.2006
Цитата: RussianSpy
ну прям театр одного актера



это точно :D

44K
30 ноября 2008 года
devote
8 / / 28.11.2008
Цитата: dead_star
что-то оно опять перестало работать :(
видать опять что-то накрутил
вот мой код, тоже что и в мане
Код:
function _create($file, $type){
  // проверяю установлена ли функция
  if (!function_exists($type)) return FALSE;
  try {
   if ($this->image=@$type($this->root.$file)){ // здесь возникает ошибка которую не удается перехватить
    // если все отработало нормально открываю права на файл
    @chmod($this->root.$file, 0777);
   } else {
    // в случае ошибки возвращаю ее
    throw new Exception('Fatat error: excess memory size');
   }
  } catch (Exception $e){
   // в случае ошибки возвращаю FALSE
   return FALSE;
  }
  // если все успешно, возвращаю ссылку на объект картинки
  return $this->image;
 }



Вопрос, зачем строить подобный метод? Как я понимаю все это награмождено ради проверки существования функции, что-то громозко... и еще не совсем понимаю как это относится к imagecreatefromjpeg.

312
02 декабря 2008 года
dead_star
392 / / 26.11.2006
Цитата: devote
Вопрос, зачем строить подобный метод? Как я понимаю все это награмождено ради проверки существования функции, что-то громозко...


вообще проверку на существование функции выполняет только одна строка из всего кода

 
Код:
if (!function_exists($type)) return FALSE;

эта проверка проводится для того что бы убедится в том что модуль GD включен и переданная функция существует
остальная же часть кода предназначена для проверки на успешность выполнения функции, к сожалению она не отрабатывает так как надо
Цитата: devote
и еще не совсем понимаю как это относится к imagecreatefromjpeg.


здесь стоит пояснить
это внутренняя функция класса предназначенного для работы с GD
в GD есть ряд схожих по работе функций таких как imagecreatefromjpeg, imagecreatefromgif, imagecreatefrompng, imagecreatefromwbmp
вместо того чтобы реализовывать проверку при инициализации каждой из функций я создал дополнительный метод который выполняет инициализацию и к которому обращаются вызывающие методы как к внутреннему методу

Код:
class GD {
...
 function create_jpeg($file){
  return $this->_create($file, "imagecreatefromjpeg");
 }
 function create_gif($file){
  return $this->_create($file, "imagecreatefromgif");
 }
 function _create($file, $type){
  if (!function_exists($type)) return FALSE;
  try {
   if ($this->image = $type($this->root.$file)){
    return $this->image;
   } else {
    throw new Exception();
   }
  } catch (Exception $e){
   return FALSE;
  }
 }
...
}

такой API не очень удобен, но выглядит яснее и короче ИМХО
55K
25 ноября 2009 года
linarko
1 / / 25.11.2009
Imagick может помочь решить проблему
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог