2014-03-20 3 views
0

Никогда не попадалось это раньше ...исчерпания памяти с маленькими файлами

Я загрузка 2 файлов, один, который 371kb, а другой, чем 291KB.

public function useImage($image, $photoid){ 

    $source = $image['tmp_name']; 
    $target = "projectimages/"; 

    //prepare the largest image 

    $targetname = $photoid."large.jpg"; 
    $file = $target . $targetname; 
    copy($source, $file); 

    list($width, $height) = getimagesize($file); 

    $modwidth = 800; 

    $diff = $width/$modwidth; 

    $modheight = $height/$diff; 
    $tn = imagecreatetruecolor($modwidth, $modheight); 
    $image = imagecreatefromjpeg($file); 
    imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height); 

    imagejpeg($tn, $file, 100); 

    //prepare the smaller image 

    $targetname = $photoid."small.jpg"; 
    $file = $target.$targetname; 
    move_uploaded_file($source, $file); 

    list($width, $height) = getimagesize($file); 

    $modwidth = 400; 

    $diff = $width/$modwidth; 

    $modheight = $height/$diff; 
    $tn = imagecreatetruecolor($modwidth, $modheight); 
    $image = imagecreatefromjpeg($file); 
    imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height); 

    imagejpeg($tn, $file, 100); 

} 

Я использую эту функцию для изменения их размера, чтобы сделать их меньше, функция запускается для каждого изображения.

При достижении меньшего сечения изображения функции, то фотография не изменяется и вместо того, чтобы ошибка выскакивает, говоря:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 10368 bytes) in /Applications/MAMP/htdocs/bs/classes/image.php on line 202 

, который находится на этой линии:

$image = imagecreatefromjpeg($file); 

Как эти маленькие изображения исчерпывают всю память?

Спасибо.

+1

Размер файла намного менее важен, чем разрешение по горизонтали и вертикали, а глубина цвета .... Память необходима просто для хранения данных изображения по горизонтали x по вертикали x 4 (цветных) байта; поэтому для изображения с разрешением 1024 x 768 требуется, по крайней мере, 3,145,728 байт (около 3 МБ) –

+0

Итак, у меня есть выделение из 33 мб примерно? 2600 x 2000 - это изображение, то есть это потребует примерно 20 МБ. Поскольку я копирую изображение, а затем перемещаю оригинал, и оба изображения примерно 20 МБ, это займет меня до 40 МБ и превышает лимит, когда он выполняется в одной функции? Так оно работает? – sark9012

+0

в принципе, да ..... у вас одновременно есть $ image и $ tn в памяти; это 2600x2000x4 + 800x615x4 плюс рабочее пространство для вашего вызова imagejpeg(), а также память для самого PHP и код вашего скрипта, а также небольшие объемы памяти для других переменных. Работа с изображениями всегда является очень голодным процессом. –

ответ

0

не забывайте, что эти крошечные .jpg изображения в несжатом по линии вы выделенная будут гораздо больше в памяти растровых изображений

например: ширина в пиксе * высоту в ПВ * Глубина цвета бите ...

+0

Итак, у меня есть выделение из 33mb примерно? 2600 x 2000 - это изображение, то есть это потребует примерно 20 МБ. Поскольку я копирую изображение, а затем перемещаю оригинал, и оба изображения примерно 20 МБ, это займет меня до 40 МБ и превышает лимит, когда он выполняется в одной функции?Так оно работает? – sark9012

+0

Я думаю, что ты на правильном пути. Чтобы исправить это, вы можете попробовать что-то вроде присвоения null любым крупным объектам, с которыми вы закончили, ограничить размер пикселей изображений, которые вы принимаете, выложить и использовать что-то вроде imagemagick для изменения размера или просто укусить пулю и позволить больше памяти в php.ini –

+0

Да, полностью на правильном пути! Я думаю, что ответ заключается в том, чтобы ограничить размер пикселя загруженного изображения, учитывая, что я спускаюсь до 800 с 2600, для этого есть много места. На моем сервере MAMP изменение памяти в php.ini не будет проблемой, но я думаю, что когда это происходит на общем хостинге, это становится проблемой! Я буду исследовать его, но есть ли серьезные недостатки в распределении большего объема памяти, поскольку вы написали «bite the bullet»? – sark9012

Смежные вопросы