Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Allowed memory size of XXX bytes exhausted, Перехват исключения средствами php 
:(
    Опции темы
Alex13
Дата 1.7.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 30.12.2005
Где: Новосибирск

Репутация: нет
Всего: 1



Собственно, интересует возможность обработки этой ошибки.
Есть такой код:
Код

        $wh = getimagesize($file);
        $this->width = $wh[0];
        $this->height = $wh[1] + 25;
        
    try {
        $this->img = imagecreatetruecolor($wh[0], $wh[1]+25);
    }
    catch (Exception $e)
    {
        return false;
    }
        if(!$this->img)
            return false;

При этом ри работе с большими картинками частенько не хватает памяти и выбрасывается исключение типа
Код

Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 6400 bytes) in /***/includes/functions_watermark.php on line 32 (32 строка - это вызов imagecreatetruecolor())

Проблема в том, что блок try-catch не срабатывает должным образом. Можно ли как-то по-другому перехватить это исключение или хотябы спрогнозировать его и отказаться от выполнения дальнейшего кода?


--------------------
Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий.
Антисоциальный блог.
PM WWW ICQ Jabber   Вверх
IZ@TOP
Дата 1.7.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Alex13, посчитайте, каких максимальных размеров, при выделенном объеме памяти, могут быть обрабатываемые изображения и ограничьте загрузку до этого размера. Или наоборот, увеличьте размер памяти выделяемый для PHP.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
skyboy
Дата 1.7.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(Alex13 @  1.7.2008,  11:45 Найти цитируемый пост)
 блок try-catch 

относится к исключениям. исключениям, которые должны генерироваться кодом. fatal error генерирует не функция imagecreatetruecolor, а ядром РНР.
Цитата(Alex13 @  1.7.2008,  11:45 Найти цитируемый пост)
Можно ли как-то по-другому перехватить это исключение

єто не исключение.
Цитата(Alex13 @  1.7.2008,  11:45 Найти цитируемый пост)
или хотябы спрогнозировать его и отказаться от выполнения дальнейшего кода?

навряд ли. пользовательская обработка ошибок не распространяется на ошибки уровня ядра(всякие там fatal, compile и parse)

Добавлено через 2 минуты и 10 секунд
IZ@TOP, обрати внимание: он пытается выделить 6400 байт, всего лишь. так что там особо рассчитывать нечего. просто память забита(а лимит - аж 16 Мб). 
PM MAIL   Вверх
d06osipov
Дата 1.7.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Измените memory_limit в PHP.ini --- если его сделать достаточно большим ошибки не будет. А ещё вариант --- просто проверяйте размер картинки. Если он больше половины доступной памяти, выдавайте ошибку (если одновременно грузится в память не более одной картинки). Может, есть способ узначть количество задействованной памяти.
PM MAIL   Вверх
Sannis
Дата 1.7.2008, 17:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

Репутация: нет
Всего: 13



Цитата(d06osipov @  1.7.2008,  16:20 Найти цитируемый пост)
А ещё вариант --- просто проверяйте размер картинки. Если он больше половины доступной памяти, выдавайте ошибку
Если вы пользуетесь таким способом, не забудьте учесть сжатие. кроме того GD значительно больше требует памяти, чем это показывают рассчёты :(



--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
IZ@TOP
Дата 2.7.2008, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



skyboy, как знать, куда у него память делась. Я бы порекомендовал ограничить размер изображений, или посоветовал использовать сторонние библиотеки для обработки изображений (к примеру, отличным решением для того же Watermark был бы ImageMagic).


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
MuToGeN
Дата 11.7.2008, 04:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: 4
Всего: 32



Спрогнозировать можно по формуле x * y * 4. Полностью оно выглядит как mem_size = x * y * bytes_per_pixel * (1 + c1) + c2, где bytes_per_pixel = 4 для большинства версий GD, c1 и c2 подбираются опытным путем, но в большинстве случаев ничтожно малы.

Насчет перехвата фатальных ошибок был какой-то механизм, основанный на недокументированных фичах буферизации вывода.


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
sTa1kEr
Дата 12.7.2008, 02:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(MuToGeN @  11.7.2008,  05:26 Найти цитируемый пост)
Насчет перехвата фатальных ошибок был какой-то механизм, основанный на недокументированных фичах буферизации вывода. 

Да, у Котерова есть статья и библиотечка для этого. Про перехват и обработку фатальных ошибок (Fatal Error) в PHP Вот только это очень не надежный метод, особено при не хватке памяти (для обработчика фатальных ошибок тоже память нужна). Имхо, он больше подходит для отладки, что бы выводить фатальные ошибки с бэктрейсом и дополнительной информацией в удобочитаемом виде. А на продакшене лучше настроить apache с собственным html для 500-ой ошибки.

Это сообщение отредактировал(а) sTa1kEr - 12.7.2008, 02:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.