Как оптимизировать Мульти загрузки Изображения?

kholmatov

Новичок
Проблема такая, когда я собираюсь, загрузит, несколько фоток одно временно сдается фатальная ошибка
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 12288 bytes)
Максимальный memory_limit 64M больше не возможно увеличивать у моего сервера (сайта)
(На Локалке все работает Ок так как у меня memory_limit 256M )
Можно ли как то оптимизировать сам код?
Сам код вставлю ниже:
PHP:
uploader(count($_FILES ['media']['name']));
	 
function uploader($count)
{
	 if(isset($count))
	 {
		$compression=100;//Сжатия
		$root_path_full  ='images/full/'; //Путь к большим изображением  
		$root_path_small ='images/small/';//Путь для отрезанной фотки  
		$root_path  ='images/'; //Путь, где загружаем оригинал

	for($i=0;$i<$count;$i++)
	{
//формируем имя уникальное файла    
$apend[$i]=date('YmdHis').rand(100,1000).'.jpg'; 
	    
 move_uploaded_file($_FILES['media']['tmp_name'][$i],$root_path.$apend[$i]);
				
	    $imagge=$root_path.$apend[$i];
	    
           $imagge_out=$root_path_full.$apend[$i];
	    $this->imageresize($imagge_out,640,$imagge,$compression);
												
	    $imagge_out2=$root_path_small.$apend[$i];
	    $this->imageresize($imagge_out2,218,$imagge,$compression,160);
					
	  //удаляем исходный файл
		if(@file_exists($root_path.$apend[$i])){
		unlink($root_path.$apend[$i]);
		}
	}

		return $apend; //возвращаем имена для сохранении в БД
	}
}

function imageresize($outfile,$neww,$infile,$quality,$newh=false) {
    $im=imagecreatefromjpeg($infile);
    if(!$newh)$newh=$neww*imagesy($im)/imagesx($im);
    $im1=imagecreatetruecolor($neww,$newh);
    imagecopyresampled($im1,$im,0,0,0,0,$neww,$newh,imagesx($im),imagesy($im));
    imagejpeg($im1,$outfile,$quality);
    imagedestroy($im);
    imagedestroy($im1);
    }
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Разбить загрузку изображений и ресайз на 2 независимые операции? Обычно при такой ошибке показана строка на которой произошло исчерпание памяти, или нет?

Для чего тут $apend[$i]? Можно просто строковую переменную перезаписывать заного с каждой итерацией.
@file_exists - убрать собаку нафик.
 

A1x

Новичок
грузить несколько фоток не одной формой, а каждую отдельным постом, яваскриптом или флешем
 

kholmatov

Новичок
>Разбить загрузку изображений и ресайз на 2 независимые операции?
Это не понял ???

>Обычно при такой ошибке показана строка на которой произошло исчерпание памяти, или нет?
Да показано ошибка Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 12288 bytes)
именно при модернизации изображения функция
PHP:
imagecreatefromjpeg()
даёт такую ошибку.

>Для чего тут $apend[$i]?
на эту массив сохраняем новые имена фоток
PHP:
//формируем имя уникальное файла    
$apend[$i]=date('YmdHis').rand(100,1000).'.jpg';
>Можно просто строковую переменную перезаписывать заного с каждой итерацией.
пример можете показать ??

>@file_exists - убрать собаку нафик.
проверяем сам файл если имеется файл просто удаляем.
PHP:
//удаляем исходный файл
        if(@file_exists($root_path.$apend[$i])){
        unlink($root_path.$apend[$i]);
        }
 

kholmatov

Новичок
грузить несколько фоток не одной формой, а каждую отдельным постом, яваскриптом или флешем
как обойтись тогда когда еще в база объект не создано ? дело в том, что каждая фотка сохраняется почти параллельно с объектом в БД.
С начало добавляем сам объект и возьмём последний ID - объекта и с этом ID в таблицу media сохраняем фотки
obj_id // ID - объекта
photo // имена фоток
 

tz-lom

Продвинутый новичок
kholmatov
а хотябы руская языко учить не пробовали?

и чёрт возьми зачем вам какой то ID для сохранения в базу, INSERT всё сам делает
 

kholmatov

Новичок
kholmatov
а хотябы руская языко учить не пробовали?
как и можем таки постараемся

и чёрт возьми зачем вам какой то ID для сохранения в базу, INSERT всё сам делает
смотрите я знаю что INSERT все сделает дело в том, что у меня два таблицы
1. Object - в эту таблицу хранятся сам объект(id, title, description)
2. Media - в эту таблицу хранятся фотки объекта (id, obj_id, photo)
вот поэтому мне нужно взят id объекта вовремя добавление и с этом ID сохранять все фотки в таблицу MEDIA
 

tz-lom

Продвинутый новичок
kholmatov
а в чём проблема передавать картинку вместе с ID объекта к которому она будет привязана?
 

kholmatov

Новичок
kholmatov
а в чём проблема передавать картинку вместе с ID объекта к которому она будет привязана?
этот вопрос был задан пользователю A1x:
>грузить несколько фоток не одной формой, а каждую отдельным постом, яваскриптом или флешем
 

tz-lom

Продвинутый новичок
kholmatov
помоему маршрутизация вопроса в корне неправильная
 

kholmatov

Новичок
Всё я сам буду решать данную проблему Тема закрыто!!!
Спасибо за советы.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Блииин, ну пиши ты правильно, ладно там, когда реальные опечатки просто, но когда совершенно не стыкующиеся в предложении слова, этаписец!

То ли я неясно пишу, то ли кто-то не понимает, что не надо там копить никакой массив $apend[$i]=date('YmdHis').rand(100,1000).'.jpg';

$apend = date('YmdHis').rand(100,1000).'.jpg'; < все, ты понимаешь что у тебя там массив копится, сначала там $apend[$i] где $i = 1, потом 2, потом 3, а в реальности ты используешь дальше только тот индекс, который тебе нужен, потому массив - взял и убрал.

Потом убрать к хренам загрузку в $root_path ='images/'; Зачем ты ее сделал? Ты же потом все равно удаляешь оттуда изображение.

$compression=100;//Сжатия - красива обозвал и неверно, ибо это не сжатия, а качетво выходного изображения.

Если ты грузишь большое и малое изображение - то и грузи 2, не за чем тебе еще плодить одну штуку.
 

A1x

Новичок
как обойтись тогда когда еще в база объект не создано ?
можно генерировать какой-то уникальный ключ (хоть метку времени) и передавать его с каждым файлом
если вдруг на хостинге есть ImageMagick - использовать его вместо GD
 

SiZE

Новичок
<input type="hidden" name="key" value="asda1q21as89d7a98sd7asd" />
Храним в базе у аттачей этот ключ. При сохранении объекта с этим ключом, апдейтим аттачи у которых аналогичный ключ, указывая им id объекта. По крону периодически чистим файлы добавленные, например, сутки назад, но так и не привязанные к объекту.
 

skryisli

Новичок
kholmatov написал(а):
смотрите я знаю что INSERT все сделает дело в том, что у меня два таблицы
1. Object - в эту таблицу хранятся сам объект(id, title, description)
2. Media - в эту таблицу хранятся фотки объекта (id, obj_id, photo)
вот поэтому мне нужно взят id объекта вовремя добавление и с этом ID сохранять все фотки в таблицу MEDIA
mysql_insert_id();
 

skryisli

Новичок
Ну, по оптимизации самого кода:
PHP:
        $compression=100;//Сжатия
PHP:
        define(compression, 100);//Сжатия
Константы храни в константах!

PHP:
$apend[$i]=date('YmdHis').rand(100,1000).'.jpg';
PHP:
$append[$i]=md5(microtime()).'jpg';
Можешь поверить - это имя будет уникальней некуда. И не мучай несчастный рандом. Он от того же микротайма пляшет.

Теперь вспоминаем, что каждая переменная - это зарезервированная память, а лишние переменные - это зло.
PHP:
 move_uploaded_file($_FILES['media']['tmp_name'][$i],$root_path.$apend[$i]);
PHP:
 move_uploaded_file($_FILES['media']['tmp_name'][$i],root_path.md5(microtime()).'jpg');
А лучше и константы нафиг убрать и прописать ручками. И т.д. и в таком ключе.

Ну и ещё один моментик. Лично я move_uploaded_file в таких случаях не использую. Ты всё равно когда размер меняешь указываешь откуда брать и куда сохранять. Укажи на входе tmp_name, а на выходе твой уникум и шлёпни темп. Это быстрее.
 

AmdY

Пью пиво
Команда форума
Можешь поверить - это имя будет уникальней некуда. И не мучай несчастный рандом. Он от того же микротайма пляшет.
а md5 ты специально добавил, чтобы была вероятность коллизий? его нужно убрать
в есть специальная функция http://php.net/uniqid
 

AmdY

Пью пиво
Команда форума
skryisli
разные строки могут давать одинаковый хеш. вероятность коллизий для набора цифр практически ноль. но смысла уникальный набор цифр пропускать через md5 не вижу.
 

skryisli

Новичок
AmdY ну китайцы нашли, вроде, способ отлавливать одинаковые хэши, но в коллизии микротайма я не верю вообще. Он на время завязан и, соответственно, вероятность встретить одинаковый хэш раз в тысячелетие, наверное. Я бы больше страшился вероятности обращения в одну миллисекунду.
AmdY написал(а):
смысла уникальный набор цифр пропускать через md5 не вижу
В принципе да. Я просто функции не знал.
 
Сверху