Никогда не попадалось это раньше ...исчерпания памяти с маленькими файлами
Я загрузка 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);
Как эти маленькие изображения исчерпывают всю память?
Спасибо.
Размер файла намного менее важен, чем разрешение по горизонтали и вертикали, а глубина цвета .... Память необходима просто для хранения данных изображения по горизонтали x по вертикали x 4 (цветных) байта; поэтому для изображения с разрешением 1024 x 768 требуется, по крайней мере, 3,145,728 байт (около 3 МБ) –
Итак, у меня есть выделение из 33 мб примерно? 2600 x 2000 - это изображение, то есть это потребует примерно 20 МБ. Поскольку я копирую изображение, а затем перемещаю оригинал, и оба изображения примерно 20 МБ, это займет меня до 40 МБ и превышает лимит, когда он выполняется в одной функции? Так оно работает? – sark9012
в принципе, да ..... у вас одновременно есть $ image и $ tn в памяти; это 2600x2000x4 + 800x615x4 плюс рабочее пространство для вашего вызова imagejpeg(), а также память для самого PHP и код вашего скрипта, а также небольшие объемы памяти для других переменных. Работа с изображениями всегда является очень голодным процессом. –