У меня есть скрипт PHP, который используется для изменения размера изображений в папке FTP пользователя для использования на его веб-сайте.
Несмотря на медленное изменение размера, скрипт завершил корректно со всеми изображениями в прошлом. Однако недавно пользователь загрузил альбом изображений JPEG с разрешением 21 мегапикселя, и, как я обнаружил, сценарий не может преобразовать изображения, но не выдает никаких ошибок PHP. Когда я просматривал различные журналы, я обнаружил, что несколько процессов Apache были завершены с ошибками Out Of Memory.
Функциональная часть скрипта PHP - это, по сути, цикл for, который перебирает мои изображения на диске и вызывает метод, который проверяет, существует ли миниатюра, а затем выполняет следующее:
$image = new Imagick();
$image->readImage($target);
$image->thumbnailImage(1000, 0);
$image->writeImage(realpath($basedir)."/".rescale."/".$filename);
$image->clear();
$image->destroy();
Сервер имеет 512 МБ оперативной памяти, обычно не менее 360 МБ + свободной.
В PHP ограничение памяти установлено на 96 МБ, но я уже устанавливал его выше без какого-либо влияния на проблему.
По моим оценкам, 21-мегапиксельное изображение должно занимать область 80 МБ + в несжатом виде, и поэтому я озадачен, почему ОЗУ так быстро исчезает, если объекты Image Magick не удаляются из памяти.
Можно ли каким-то образом оптимизировать мой сценарий для более эффективного использования памяти или сбора мусора?
У меня просто нет оперативной памяти, чтобы справиться с такими большими изображениями?
Приветствия