(PHP) Опять про Allowed memory size of xxx bytes exhausted

Василий Теркин
Дата: 11.10.2006 22:22:07
Доброго времени суток всем!!!

Погуглив в нете и в архиве формуа я так и не смог понять, что вызывает эту ошибку и как ее избежать.
Задача у меня такая: нужно получить из формы картинку (jpg), уменьшить ее до нужных размеров и сохранить на серваке. Дома стоит ПХП5 с лимитом памяти в 8мб , закидываю картинку размером в 1,47мб (2048х3072, сфоткана камерой Canon). Проглатывает, обрабатывает, сохраняет. Отлично. Выкладываю скрипт на сервак (8мб мемори лимит, версии gd одинаковы (интересно почему?) у меня и на серваке, хотя на серваке пхп4), все, выскакивает эта ошибка. Скрипт вот такой:

$im = imagecreatefromjpeg($_FILES['foto']['tmp_name'])
   or die("Невозможно загрузить новый поток GD");

$ow = imagesx($im);
$oh = imagesy($im);
$dst_img = imagecreatetruecolor($ow-($ow-184),$oh-($oh-280));
imagecopyresampled($dst_img, $im, 0,0,0,0, $ow-($ow-184), $oh-($oh-280), magesx($im), imagesy($im)); 
imagedestroy($im);
imagejpeg($dst_img,$fname_foto);	  
imagedestroy($dst_img);

Экспирементирую далее: ставлю на серваке мемори лимит 16мб, та же ошибка, 32мб - ошибки нет, но и файла сохраненного тоже там нет.
Пробую другую картинку - 413кб, 1200х1600, сфоткана камерой Olympis, та же ошибка, пробую еще одну фотку - 541кб (!), 1280х960, сфоткана камерой Sony - сервак успешно проглотил, обработал, сохранил.
Все перечисленные картинки дома обрабатываются на ура и никто мне голову не морочит. В чем здесь дело и как побороть сию проблему???
Благодарю за любую помощь!
Aaz(aka Antson)
Дата: 12.10.2006 12:58:50
оцени реальный размер картинки в памяти для твоих тестовых фоток

объем_В_Мб = ширина*высота*число_каналов*(бит_на_канал/8)/1024/1024

getimagesize ( string filename [, array imageinfo] )
With JPG images, two extra indexes are returned: channels and bits. channels will be 3 for RGB pictures and 4 for CMYK pictures. bits is the number of bits for each color.
Aaz(aka Antson)
Дата: 12.10.2006 13:02:56
1200*1600 при RGB 16 бит занимает в памяти почти 11 метров.
а тебе еще нужна оперативка для размещения пересчитанной картинки и для проведения пересчета тоже отъедается.
Василий Теркин
Дата: 12.10.2006 19:22:12
Aaz(aka Antson)

объем_В_Мб = ширина*высота*число_каналов*(бит_на_канал/8)/1024/1024


В курсе я этой формулы. Придется, видимо, ставить ограничение на размер загружаемых фоток. Тока мне все равно остается не понятен факт того, что дома-то скрипт выполняется при любых разрешениях, хотя стоит лимит в 8мб...
Aaz(aka Antson)
Дата: 13.10.2006 08:59:04
Возможно php под винду собран без ключа --enable-memory-limit.
Что конкретно используешь дома ?
За денвером я заметил, что ему лимит памяти в конфиге както фиолетов.
Aaz(aka Antson)
Дата: 13.10.2006 09:00:26
з.ы.
А упростить выражение не пробывал
$ow-($ow-184) = ($ow-$ow)+184 = 184
:)
Василий Теркин
Дата: 13.10.2006 16:55:47
Aaz(aka Antson)

$ow-($ow-184) = ($ow-$ow)+184 = 184


А в чем здесь упрощение? =)

По поводу денвера - не, не пользуюсь я им. Стоит пхп 5.1.2, скачанный откуда-то (не помню откуда), естественно я его сам не собирал. Возможно не только денверу фиолетово по поводу мемори лимита в конфиге. Вопрос: как узнать, сколько конкретно пхп схавал памяти при обработке фотки?
Kachalov
Дата: 13.10.2006 17:47:08
Василий Теркин
Вопрос: как узнать, сколько конкретно пхп схавал памяти при обработке фотки?

memory_get_usage
Василий Теркин
Дата: 13.10.2006 18:37:57
Kachalov

memory_get_usage


Call to undefined function memory_get_usage().
Это значит, что мой пхп скомплирован без ключа --enable-memory-limit? И, следовательно, это значит, что пхп хаватет ровно столько памяти, сколько ему нужно для обработки фотки и никакие мемори лимит в конфиге ему не в указ? А как можно узнать без memory_get_usage() кол-во схаванной памяти?
*
Дата: 15.10.2006 09:04:06
Когда ж Вы внимание обращать на комментарии пользователей научитесь?