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

  • Автор темы Автор темы vladZzz
  • Дата начала Дата начала

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)
 
vladZzz, ты не те справочные данные привёл - приведи размер картинки-оригинала, при котором происходит нехватка памяти. А всё остальное - лабуда по большей части.
PS: картинка 640x480 - это уже 1 Мб оперативы.
 
JPG - это СЖАТЫЙ формат.
чтобы с ним работать, надо его распаковать.
каждая точка кодируется тремя байтами.
самостоятельно требуемый размер посчитаешь? или арифметику в первом классе прогуливал?
 
я в курсе, так же в курсе что GD распаковывает его в свой формат, аналогичный по размеру с BMP.
 
> 1436x1024 - JPG - 267kb
В памяти это получается 1436x1024x3 = 4.4 Мб, т.е. в сумме с превьюшкой получается > 5.7 Мб.
Мне сказать больше нечего - может кто другой, более опытный, прокомментирует? Ещё можно вспомнить о функции [m]memory_get_usage[/m].

-~{}~ 27.02.05 23:02:

> выставил Memory Limit = 16M
Ты точно уверен, что он у тебя выставился?
 
я в курсе, так же в курсе
я смотрю, ты такой продвинутый, в курсе всего.
а головой думать не пробовал? сопоставлять те вещи, по которым ты в курсе, между собой? или как раз с этим проблемы?
 
> Ты точно уверен, что он у тебя выставился?

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

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

или тебе надо разжевать сказанное мной?
 
Panchous
Huckster
русским по белому написано -- vds

vladZzz
у тебя картинки типа две, а не одна
 
> $idest = imagecreatetruecolor($width, $height);

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