Я немного поработал над этим, и я понимаю, что невозможно восстановить из-за фатальной ошибки исчерпанной памяти. У меня есть сценарий, который запускает imagecreatefromjpeg. Я попытался поймать исключение, я попробовал запустить функцию с @, а затем проверил возвращаемое значение для null или false, я попробовал запустить его с помощью функции «die ()». Ничего не работает. Поэтому я не могу «восстановить» его.
Так можно ли предвидеть это, прежде чем я доберусь до него? Можно ли проверить несжатый размер jpeg, а затем умереть грациозно? Я хочу отправить сообщение своим пользователям по строкам «Изображение $ image слишком велико для обработки. Вам нужно будет создать миниатюру вручную».
Мой общий хост не позволит мне увеличить объем памяти до 64 МБ, так что это не вариант. Мой код выглядит следующим образом …
function createthumb($section,$filename,$constrain=100) { $dir = "$section/thumbs_$constrain"; if(file_exists($workingdir."$section/thumbs_$constrain/$filename")) return 1; if(!file_exists($dir)) mkdir($dir); $src = imagecreatefromjpeg($workingdir."$section/$filename"); ...
Как правило, вы можете использовать размер в пикселях, возвращаемых getimagesize () :
list ($width, $height) = getimagesize($file); $memory = $width * $height * 4; // 4 bytes per pixel
Если это число больше, чем предопределенный предел (который будет определен эмпирически, начните с чего-то вроде 32 * 1024 * 1024), то не загружайте его imagecreatefromjpeg()
.
Вы думали об использовании ImageMagic вместо GD? ImageMagic может изменять размер jpegs во время загрузки, поэтому он не потребляет много памяти PHP. Подробнее см. В этом ответе StackOverflow .
Я думаю, что только обработчик ошибок может помочь вам, так как обработка исключений может не работать при исчерпании памяти
Вы можете проверить размер источника строки перед imagegreatefromjpeg.