Я использую один сценарий загрузки изображения / обрезки / изменения размера для файлов размером до 10 МБ.
При тестировании я устанавливаю лимит памяти php_ini в 25M, и это исчерпывается при загрузке файла только около 1.4MB.
"Allowed memory size of 26214400 bytes exhausted (tried to allocate 10368 bytes)"
Мне это кажется странным, не 10368 <26214400? (Риторический вопрос)
Или это означает, что я пошел 10368 байт за 25 МБ? Должен ли мой скрипт использовать эту большую память?
Код:
function make_thumbnails($updir, $img) { $thumbnail_width = 200; $thumbnail_height = 150; $thumb_preword = "thumb_"; $arr_image_details = GetImageSize($updir.$img); $original_width = $arr_image_details[0]; $original_height = $arr_image_details[1]; if( $original_width > $original_height ){ $new_width = $thumbnail_width; $new_height = intval($original_height*$new_width/$original_width); } else { $new_height = $thumbnail_height; $new_width = intval($original_width*$new_height/$original_height); } $dest_x = intval(($thumbnail_width - $new_width) / 2); $dest_y = intval(($thumbnail_height - $new_height) / 2); if($arr_image_details[2]==1) { $imgt = "ImageGIF"; $imgcreatefrom = "ImageCreateFromGIF"; } if($arr_image_details[2]==2) { $imgt = "ImageJPEG"; $imgcreatefrom = "ImageCreateFromJPEG"; } if($arr_image_details[2]==3) { $imgt = "ImagePNG"; $imgcreatefrom = "ImageCreateFromPNG"; } if( $imgt ) { $old_image = $imgcreatefrom($updir.$img); $new_image = imagecreatetruecolor($thumbnail_width, $thumbnail_height); imageCopyResized($new_image,$old_image,$dest_x, $dest_y,0,0,$new_width,$new_height,$original_width,$original_height); $imgt($new_image,$updir.$thumb_preword.$img); // Added by your suggestions: imagedestroy($old_image); imagedestroy($new_image); } }
В сообщении об ошибке говорится, что он пытался выделить еще 10368 байт, но он недоступен. Другими словами, ваш пул из 25 МБ был исчерпан, и скрипт не смог выделить 10368 байт, в которых он нуждался.
Вы можете увеличить это ограничение в файле php.ini
, добавив или обновив строку, подобную следующей:
memory_limit = 64M
Что касается «если 25 МБ достаточно», это трудный вопрос для нас, чтобы ответить … Конечно, есть некоторые сценарии, которые на законных основаниях нуждаются в 64 МБ или даже больше. Если вы обнаружите, что вам нужно постоянно увеличивать размер пула памяти, я бы начал изучать то, что занимает столько места.
Вот связанный с этим вопрос, в котором есть хорошее обсуждение размера вашего пула памяти.
EDIT Увидев ваш код, вы можете использовать большой объем памяти при работе с изображениями. Вы можете помочь своему скрипту, вызвав imagedestroy
после того, как вы закончите с ресурсом изображения.
В дополнение к уже сказанному:
Никогда не забывайте, что обработка сжатых форматов файлов (например, JPEG) требует гораздо больше памяти, чем фактический размер файла. Файл размером 3000 x 3000 пикселей в формате JPG может весить всего 500 кбайт, но потребуется (примерно) 3000 x 3000 x 3 (по одному байту для красного, зеленого и синего цветов и в зависимости от режима еще один для Alpha) = не менее 27 МБ ,
Используйте imagedestroy
для освобождения памяти после использования:
if( $imgt ) { $old_image = $imgcreatefrom($updir.$img); $new_image = imagecreatetruecolor($thumbnail_width, $thumbnail_height); imageCopyResized($new_image,$old_image,$dest_x, $dest_y,0,0,$new_width,$new_height,$original_width,$original_height); imagedestroy($old_image); $imgt($new_image,$updir.$thumb_preword.$img); imagedestroy($new_image); }
Или это означает, что я пошел 10368 байт за 25 МБ?
Нет. Ваш скрипт пытался выделить 10368 байт, 10368 + уже выделенный> 25 МБ
Должен ли мой скрипт использовать эту большую память?
Если вы используете GD для изменения размера, да. Я бы попытался использовать другие библиотеки или консольные инструменты для обработки изображений, они могут дать больше возможностей. И вы можете решить использовать очередь для обработки изображений, а не изменять размер изображений точно в срок, если это общедоступный веб-сайт
Это означает, что в тот момент, когда вы превысили лимит, ваш скрипт пытался выделить 10368 байт, но это не удалось. Это не означает, что у вас больше не будет этой проблемы, если вы увеличите предел до 26 МБ. Ошибка может возникнуть в некоторой более поздней точке. Вы можете попытаться увеличить его на более мелкие шаги (например, 32 МБ, 48 МБ и т. Д.), Пока вы больше не получите эту ошибку.