Не работает скрипт сжатия рисунков больше 300 кВ

V5
На сайте с 19.03.2008
Offline
23
1014

На моем компьютере срипт работает полноценно. При загрузке на сервер обрабатывает максимум 250 кВ. Кто знает в чем может быть причина, подскажите пожалуйста.

Было обнаружено, что не срабатывает ф-ция imagecopyresampled

Вот скрипт:


$src=$dir.$_FILES["myfile"]["name"];
$dest="foto/$a/ava.jpg" ;
$width=150;
$height=280;









function img_resize_real($src, $dest, $width, $height, $rgb=0xFFFFFF, $quality=78)
{
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;

/* alg */
$src_w = intval($size[0]);
$src_h = intval($size[1]);
$set_w = abs(intval($width));
$set_h = abs(intval($height));
$src_x = $src_y = 0;

if ($set_w == 0 && $set_h == 0) { $set_w = $src_w; $set_h = $src_h; }
if ($set_w > 0 && $set_h == 0) { $set_h = ceil($src_h*$set_w/$src_w); }
if ($set_h > 0 && $set_w == 0) { $set_w = ceil($src_w*$set_h/$src_h); }
$prc_w = ceil($src_w*$set_h/$src_h);
$prc_h = ceil($src_h*$set_w/$src_w);
if ($prc_h >= $set_h)
{
$out_w = $set_w; $out_h = $prc_h;
}
else
{
$out_w = $prc_w; $out_h = $set_h;
}
if ($out_w > $set_w)
{
$xw = ceil($set_w*$src_h/$set_h);
$src_x = ceil(($src_w-$xw)/2);
}
if ($out_h > $set_h)
{
$xh = ceil($set_h*$src_w/$set_w);
$src_y = ceil(($src_h-$xh)/2);
}

if ($out_w > $set_w || $out_h > $set_h)
{
if ($out_w > $set_w)
{
$h = ceil($out_h*$set_w/$out_w); $w = $set_w;
}
if ($out_h > $set_h)
{
$w = ceil($out_w*$set_h/$out_h); $h = $set_h;
}
}
else
{
$w = $out_w; $h = $out_h;
}
$src_x = $src_y = 0;
$set_w = $out_w = $w;
$set_h = $out_h = $h;
/* alg */



// Создаем новое изображение
$idest = imagecreatetruecolor($set_w, $set_h);

//
//
//


$isrc = $icfunc($src);

// Копируем существующее изображение в новое с изменением размера:
imagecopyresampled(
$idest, // Идентификатор нового изображения
$isrc, // Идентификатор исходного изображения
0,0, // Координаты (x,y) верхнего левого угла
// в новом изображении
$src_x,$src_y, // Координаты (x,y) верхнего левого угла копируемого
// блока существующего изображения
$out_w, // Новая ширина копируемого блока
$out_h, // Новая высота копируемого блока
$size[0], // Ширина исходного копируемого блока
$size[1] // Высота исходного копируемого блока
);



imagejpeg($idest, $dest, $quality);


//
//
//

imagedestroy($isrc);
imagedestroy($idest);

return array('width' => $out_w, 'height'=> $out_h);

}








if (img_resize_real("$src","foto/$a/ava.jpg",150, 280))
{echo '<strong>Фото успешно загружено</strong>';
unlink ("$src");

}
else
{echo '<strong>Произошла ошибка! Попробуйте еще раз</strong>'; }

bukachuk
На сайте с 07.09.2008
Offline
97
#1

Возможно на сервере урезана память для PHP, какую ошибку выдает ?

Программирование PHP,Mysql (/ru/forum/934470)
[Удален]
#2
bukachuk:
Возможно на сервере урезана память для PHP, какую ошибку выдает ?

Да оптимальный вариант

Cranking
На сайте с 30.11.2008
Offline
172
#3

Дабы не гадать напишите в сапорт хостингу)

Аудит сайта и консультации по продвижению и оптимизации. (/ru/forum/568390) Дешевле чем у других форумчан на форуме, много отзывов (моя тема)
zhidronsss
На сайте с 12.10.2007
Offline
36
#4

код вроде нормальный, без затыков, с первого взгляда.

настройка сервера - выделение памяти

тут вроде об этом говорят http://bytes.com/groups/php/3659-memory-problem-imagecreatefromstring-function

V5
На сайте с 19.03.2008
Offline
23
#5

Хостер говорит, что на скрипт выделено до 32 Мb. В php.ini выставлено 16 Мb

Ошибка такая:

Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 9920 bytes) in on line ***

line ***:


$isrc = $icfunc($src);
stealthy
На сайте с 15.06.2006
Offline
69
#6

Ну так в чем вопрос? В сообщении об ошибке все написано - память истощилась, ошибка при вызове функции imagecreatefromформат. Значит вы даже загрузить в память изображение не можете. Посчитайте сколько оно должно занимать в памяти в развернутом виде - примерно как длина*ширина*3 байта на цвет. Или возьмите jpeg или что вы там грузите в скрипт и сохраните как BMP на диск, тогда его размер и покажет сколько джепег у вас места займет при поднятии с диска в память.

Если размер памяти, требуемый для распаковки изображения у вас будет, предположим, 10 Метров, то значит 6 оставшихся съедено самим скриптом - оптимизируйте код по потреблению памяти, насколько это возможно.

Еще была недавно похожая проблема на одном из хостингов, там чего-то перемудрили с временными файлами в ImageMagick и тоже с относительно небольшими картинками ничего не работало. А GD работала, поскольку либо настройки были более пряморукие, либо она не использует временные файлы для подобных операций. На всякий случай, может кому пригодится информация.

Twilight CMS (http://www.twl.ru): есть Free версия, очень проста и удобна в использовании. Консультирую по любым вопросам. Новый спорт - практическая стрельба (http://nikit.in) - не для офисного планктона.
[Удален]
#7

Тс, ИМХО, тебе сервер наладить нужно а не скрипт

V5
На сайте с 19.03.2008
Offline
23
#8

Хостер говорит что увеличь нельзя обьем памяти... Хостинг у меня на Domishko.ru. Может кто-то имел дело с этим хостером? Или может есть другой способ уменьшить рисунок с меньшей нагрузкой на сервер?

ciber
На сайте с 04.01.2008
Offline
215
#9

взять другой хостинг. Сейчас впс можно за сущие копейки аредовать. например на фирствдс

[Удален]
#10
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 9920 bytes) in on line ***

Баг PHP 5.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий