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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как очистить память? 
:(
    Опции темы
kulikoff
Дата 24.6.2009, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Работает скрипт, который загружает картинку изображения на хост, потом делает ресайз, создает ещё одну копию заданного размера для предпросмотра. Максимальное, что удалось загрузить - это изображение 1400х1400 32 бита, в большем разрешении выдает ошибку переполнения памяти 
Код

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 3456 bytes) 

Тема на форуме поднималась, но так и небыла решено программно, просто люди решили не грузить более 1400х1400 пикселей. Скажите, как на промежуточных стадиях можно почистить память?
PM MAIL WWW ICQ Skype   Вверх
webber
Дата 24.6.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



php.ini

memory_limit
PM MAIL   Вверх
kulikoff
Дата 24.6.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не позволяет хостер...
PM MAIL WWW ICQ Skype   Вверх
azesmcar
Дата 24.6.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



kulikoff

unset не поможет?
PM   Вверх
kulikoff
Дата 24.6.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

unction upload_image($file_name, $folder_name,$no_image,$new_file_name) {
        $good_images=$_FILES[$file_name]['name'];
            if ($good_images=="") {
                $good_images="";    
            } else {
                $uploaddir = $folder_name; 
                $uploadfile = $uploaddir ."/".$new_file_name.".jpg"; 
                if (move_uploaded_file($_FILES[$file_name]['tmp_name'], $uploadfile)) { 
                    $good_images="$folder_name/".$new_file_name.".jpg";
                }

            }
        return $good_images;                                    
    }

unset() чего?
PM MAIL WWW ICQ Skype   Вверх
icewind
Дата 24.6.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 11.4.2009
Где: Ростов-на-Дону

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



Вы уверены что переполнение памяти происходит в момент перемещения файла? Мне кажется более вероятным что сбой происходит при попытке ресайза изображения. Чтоб сказать точнее нужно видеть код.


--------------------
user posted image
PM MAIL Skype   Вверх
kulikoff
Дата 24.6.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сначала я делаю ресайз такой функцией:
Код

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;

  $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;

}

потом загружаю большое изображение (уже подогнанное под стандартный размер) функцией
Код

function upload_image($file_name, $folder_name,$no_image,$new_file_name) {
        $good_images=$_FILES[$file_name]['name'];
            if ($good_images=="") {
                $good_images="";    
            } else {
                $uploaddir = $folder_name; 
                $uploadfile = $uploaddir ."/".$new_file_name.".jpg"; 
                if (move_uploaded_file($_FILES[$file_name]['tmp_name'], $uploadfile)) { 
                    $good_images="$folder_name/".$new_file_name.".jpg";
                }

            }
        return $good_images;                                    
    }

После создаю уменьшенную копию
Код

$im=imagecreatefromjpeg($good_image);
$ox=imagesx($im);
$oy=imagesy($im);
$nx=180;
$ny=floor($oy*$nx/$ox);
$nm=imagecreatetruecolor($nx,$ny);
imagecopyresized($nm,$im,0,0,0,0,$nx,$ny,$ox,$oy);
$new_file_name_s="user_photo_".$new_photo_id."_s.jpg";
imagejpeg($nm,"photo/$new_file_name_s");
$new_image="photo/$new_file_name_s";

Это код, который выполняет задуманный алгоритм. Умирает на первом ресайзе... Можно как-то загурузить фотку, очистить память и потом делеть ресайз? Как то сделать?

Это сообщение отредактировал(а) kulikoff - 24.6.2009, 21:55
PM MAIL WWW ICQ Skype   Вверх
solenko
Дата 25.6.2009, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(kulikoff @  24.6.2009,  16:10 Найти цитируемый пост)
Тема на форуме поднималась, но так и небыла решено программно, просто люди решили не грузить более 1400х1400 пикселей. Скажите, как на промежуточных стадиях можно почистить память?

Небыло решено потому что такого решения просто нет. Для обработки изображения нужна память и от этого никуда не деться. Так что вариантов решения два:
1. Увеличть memory_limit
2. Вынести обработку изображений из php -- переложить это на любую консольную утилиту, например, imagemagick

Добавлено через 1 минуту и 31 секунду
размер памяти, который вам нужен будет при обработке gd = width*height*32


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


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


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

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



Цитата(solenko @  25.6.2009,  06:44 Найти цитируемый пост)
width*height*32 

это в байтах?
может, все же width∙height∙4?
PM MAIL   Вверх
solenko
Дата 25.6.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(skyboy @ 25.6.2009,  08:21)
Цитата(solenko @  25.6.2009,  06:44 Найти цитируемый пост)
width*height*32 

это в байтах?
может, все же width∙height∙4?

Это в битах


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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