не хватает памяти при resize картинки

vladZzz

Guest
не хватает памяти при resize картинки

Добрый день. Проблема следующая:

На сайте есть галерея, причем галерея вполне нормально работает на win-машине, никаких проблем не наблюдалось.

Но на freebsd хостинге периодически выдают лимит памяти. Я конечно же сразу полез искать в инет - искать ответы по этому вопросы. Нашел пару обсуждений на форумах, выставил Memory Limit = 16M как там рекомендовали - всё равно не помогает.

Что можете посоветовать?

В справочных целях привожу свой php скрипт:

// Цикл, т.к. фотографий несколько и они последовательно перебираются. Для тех кто скажет что проблема в цикле говорю заранее что без цикла при загрузке одной фото проблема остаётся.

for($i=1; $i<=3; $i++)
{

$f_title = 'form_title_'.$i;
$f_filename = 'form_filename_'.$i;

if($$f_title & $$f_filename)

{
// Закачиваем фотографию и её превью
// ---------------------------------

$pub_dir = 'pub/gallery/g'.$id;
$pub_preview = $pub_dir.'/preview';

mt_srand();
$random = mt_rand('1000', '10000');

$image = $random.'.jpg';

img_resize($HTTP_POST_FILES['form_filename_'.$i]['tmp_name'], $pub_preview.'/'.$image, 200, 150);
img_resize($HTTP_POST_FILES['form_filename_'.$i]['tmp_name'], $pub_dir.'/'.$image, 640, 480);

$image_preview = addslashes($pub_preview.'/'.$image);
$image = addslashes($pub_dir.'/'.$image);


// Добавляем данные в БД
// ---------------------------------



mysql_query('UPDATE gallery_divs SET pics = pics + 1 WHERE id='.$id) or die(mysql_error());

mysql_query('INSERT INTO gallery_pics (g_id, title, time, image_preview, image, size)
values ("'.$id.'", "'.$title.'", now(), "'.$image_preview.'", "'.$image.'", "'.$size.'")') or die(mysql_error());

}
}
И сама функция ресайза:

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;

}
И ещё справочных данных:

freebsd 4.1
Apache 1.3
CPU - 500mhz и RAM - 64mb (это VDS)
 

SiMM

Новичок
vladZzz, ты не те справочные данные привёл - приведи размер картинки-оригинала, при котором происходит нехватка памяти. А всё остальное - лабуда по большей части.
PS: картинка 640x480 - это уже 1 Мб оперативы.
 

Фанат

oncle terrible
Команда форума
JPG - это СЖАТЫЙ формат.
чтобы с ним работать, надо его распаковать.
каждая точка кодируется тремя байтами.
самостоятельно требуемый размер посчитаешь? или арифметику в первом классе прогуливал?
 

vladZzz

Guest
я в курсе, так же в курсе что GD распаковывает его в свой формат, аналогичный по размеру с BMP.
 

SiMM

Новичок
> 1436x1024 - JPG - 267kb
В памяти это получается 1436x1024x3 = 4.4 Мб, т.е. в сумме с превьюшкой получается > 5.7 Мб.
Мне сказать больше нечего - может кто другой, более опытный, прокомментирует? Ещё можно вспомнить о функции [m]memory_get_usage[/m].

-~{}~ 27.02.05 23:02:

> выставил Memory Limit = 16M
Ты точно уверен, что он у тебя выставился?
 

Фанат

oncle terrible
Команда форума
я в курсе, так же в курсе
я смотрю, ты такой продвинутый, в курсе всего.
а головой думать не пробовал? сопоставлять те вещи, по которым ты в курсе, между собой? или как раз с этим проблемы?
 

vladZzz

Guest
> Ты точно уверен, что он у тебя выставился?

хмм, вообще параметра не было в php.ini пришлось дописать вручную. после чего ребутнул машину. по идее должно было выставиться. сейчас проверю ещё раз.
 

Фанат

oncle terrible
Команда форума
интересно, закрыть тему, что ли?
чтобы знал, как надо вопросы на форуме задавать?..

vladZzz а по поводу того, что сообщения об ошибках несут необходимую для их исправления информацию - ты в курсе? курсовой ты наш.
 

vladZzz

Guest
Фанат, извини, если чем задел. Я не специально :)
 

Фанат

oncle terrible
Команда форума
Это все, что ты имешь сказать по теме?
вопрос исчерпан?

или тебе надо разжевать сказанное мной?
 

neko

tеam neko
Panchous
Huckster
русским по белому написано -- vds

vladZzz
у тебя картинки типа две, а не одна
 

vladZzz

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

Хотя, вроде сейчас всё нормально работает.
 
Сверху