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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переполнение памяти, как бороться... 
V
    Опции темы
Still
Дата 27.10.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PHP-программист
*


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

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



Поиск использовал, темы находил, пробовал, не выходит.

Описание (работы, алгоритма)
Есть некий каталог с данными и галереей фотографий для каждого экземпляра каталога. С данными, естественно, проблем нет. Все дело в заливке картинок. Алгоритм работы таков:
1. пользователь выбирает определенные фото для закачки;
2. идут проверки размеров и типов файлов;
3. файл закачивается во временную папку на сервере;
4. формируется новый путь для файла;
5. файл перемещается в указанную папку с новым именем (функция move_uploaded_file());
6. с помощью функции img_resize() (код ниже) производится:
6.1. уменьшение разрешения фото до необходимых размеров с перезаписью файла;
6.2. уменьшение разрешения фото до размеров превью-показа с созданием еще одного фото;
7. данные заносятся в БД.

Функция img_resize:
Код

function img_resize($src, $dest, $width, $height, $rgb=0xFFFFFF, $quality=100)
{
    if (!file_exists($src)) return false;
                
    $size = getimagesize($src);
    if ($size === false) return false;
                    
// Определяем исходный формат по MIME-информации, предоставленной
// функцией getimagesize, и выбираем соответствующую формату
// imagecreatefrom-функцию.
    $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
    $icfunc = "imagecreatefrom" . $format;
    if (!function_exists($icfunc)) return false;

    $x_ratio = $width / $size[0];
    $y_ratio = $height / $size[1];
                    
    $ratio       = min($x_ratio, $y_ratio);
    $use_x_ratio = ($x_ratio == $ratio);

    $new_width   = $use_x_ratio  ? $width  : floor($size[0] * $ratio);
    $new_height  = !$use_x_ratio ? $height : floor($size[1] * $ratio);
    $new_left    = $use_x_ratio  ? 0 : floor(($width - $new_width) / 2);
    $new_top     = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);

    $isrc = $icfunc($src);
    $idest = imagecreatetruecolor($width, $height);

    imagefill($idest, 0, 0, $rgb);
    imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);
    imagejpeg($idest, $dest, $quality);
                            
    imagedestroy($isrc);
    imagedestroy($idest);
                            
    return true;                        
}

Думаю функция известна многим, так как самая ходовая в сети.

Проблема
При обработке данной функции вылетает эксепшн переполнения памяти:
Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 4096 bytes) in (...)www.host.com.ua/.../save.php on line 384
точнее вот этот участок:
Код

$idest = imagecreatetruecolor($width, $height);

Причем заливаемое фото весит 560 КБ.

Перепробовал уже все, что нашел. Вплоть до ini_set("memory_limit", "128M").
Заранее спасибо!
PM MAIL WWW   Вверх
solenko
Дата 27.10.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Разрешение картинки какое? В памяти она будет жрать width*height*32


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Still
Дата 27.10.2008, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PHP-программист
*


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

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



solenko, это будет размер в битах?

Размер тестируемого фото 1600х2133, но возможно размеры и в два раза больше.
PM MAIL WWW   Вверх
skyboy
Дата 27.10.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Still @  27.10.2008,  21:13 Найти цитируемый пост)
это будет размер в битах?

да. но все же размер может и отличаться. мне лично неизвестно, как храинтся ресурс графики в PHP. может, там используются индексированные цвета. может - deflate-компрессия на лету. может - ещё что-то. но лучше ориентироваться на эту цифру.
Цитата(Still @  27.10.2008,  18:03 Найти цитируемый пост)
Вплоть до ini_set("memory_limit", "128M").

на самом деле, самое надежное средство - изменить php.ini, ini_set может не иметь действия по причине ограничения параметров безопасности. или же других причин.

Добавлено через 2 минуты и 23 секунды
с другой стороны, 
Цитата(Still @  27.10.2008,  18:03 Найти цитируемый пост)
Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 4096 bytes) in (...)www.host.com.ua/.../save.php on line 384

переводится как
Цитата

Фатальная ошибка: разрешенный объем памяти в 20Мб превышен(попытка выделить 4Кб) ...

не вижу ограничения в 128 Мб. указан предел в 20 Мб.

PM MAIL   Вверх
Still
Дата 28.10.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PHP-программист
*


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

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



Цитата(skyboy @  27.10.2008,  23:08 Найти цитируемый пост)
не вижу ограничения в 128 Мб. указан предел в 20 Мб.

skyboy, да, я это тоже заметил, отсюда следует, что ini_set действительно не изменяет значение memory_limit. Однако возможности изменить php.ini нет.

Есть ли другие способы уменьшить картинку без применения данной функции (и соответственно используемых в ней функциях)?
PM MAIL WWW   Вверх
solenko
Дата 28.10.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Still @  28.10.2008,  12:21 Найти цитируемый пост)
Есть ли другие способы уменьшить картинку без применения данной функции (и соответственно используемых в ней функциях)?

Консольные утилиты. Конкретной не подскажу, но google, думаю, подскажет )



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Canarat
Дата 28.10.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



http://www.imagemagick.org/script/command-...ions.php#resize
Still, здесь полный справочник по imagemagick, если он установлен на сервере.

Это сообщение отредактировал(а) Canarat - 28.10.2008, 13:53
PM MAIL   Вверх
Still
Дата 3.11.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PHP-программист
*


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

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



Нашел ошибку, а точнее это не обработка изображений разрешение которых более 1400х1400 пикселей, а сам размер файла не важен, конечно пятимегабайтные не тестировал.

Всем спасибо!
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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