[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Нехватает памяти при загрузке фотографии
Миша
Нехватает памяти при загрузке фотографии.

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 15164 bytes) 

Из этой ошибки я понял, что в моём распоряжений 64 мегабайта, но не хватило.
if(($img = imagecreatefromjpeg($_FILES['test']['tmp_name']))) { // на этой строке вылетает ошибка

} else {
return .... // прервать работу в случае ошибок, но почему то не срабатывает
}


Дальше проверил, что данная ошибка не зависит от размера файла, а зависит от количества точек (ширина-высота). т.е. ошибка вылетает даже при небольшом размере файла, но с большим расширением в ширину-высоту

Узнал, что jpg сжатый формат и когда распаковывается, каждая точка равна 3 байтам. Пытался загрузить файл 1,63 МБ, 3791*2527 (т.е. 3791*2527*3=28739571байт - 27,41 МБ), но вроде как доступно 64 МБ

Почему не срабатывает блок с return? Напишите, если правильно или нет понял всю схему. И посоветуйте как быть, отловить такую ошибку. Спасибо.

_____________
Принимаю заказы, писать в ЛС
sergeiss
Цитата (Медведь @ 27.04.2016 - 17:39)
Почему не срабатывает блок с return?

Потому что эксепшен надо. return срабатывает в случае, когда выполняются какие-то условия, но нет ошибки.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Игорь_Vasinsky
<?php
set_time_limit(0);


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Миша
Цитата (Игорь_Vasinsky @ 27.04.2016 - 18:30)
<?php
set_time_limit(0);

Не проходит даже секунды, как ошибка вываливается, да и памяти по моим расчётам должно было хватить.

_____________
Принимаю заказы, писать в ЛС
AllesKlar
Цитата (Медведь @ 27.04.2016 - 16:36)
да и памяти по моим расчётам должно было хватить

По каким расчетам?

http://php.net/manual/ru/function.memory-get-usage.php

_____________
[продано копирайтерам]
Миша
Fatal error: Out of memory (allocated 121634816) (tried to allocate 19008 bytes)

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 19008 bytes)


tried to allocate 19008 bytes - пытался выделить 19008 байт

blink.gif


_____________
Принимаю заказы, писать в ЛС
Ron
Цитата (Игорь_Vasinsky @ 27.04.2016 - 18:30)
set_time_limit(0);

Ни в коем случае. Нужна проверка с неограниченным временем - идешь в консоль. И никак иначе.

Цитата (Медведь @ 27.04.2016 - 21:05)
tried to allocate 19008 bytes - пытался выделить 19008 байт

Да, память выделяется блоками. В этом сообщении говорится, что скрипт пытался получить памяти больше максиамльной на 19008 bytes. Но это совершенно не значит что ему не хватило именно этого объема, потому что читай выше.

Тебе формулу Инвиз привел по ссылке. Я на одном из проектов кинул памяти 256Mb, только после этого большие фотографии прямо с фотоаппарата стали обрабатываться без ошибок по нехватке памяти. По ссылке сделано более изящно, хотя я не вижу ничего плохого в максимально разрешенной памяти, даже если всю физ. память отдать на PHP. Если скрипт грамотно написан ничего не будет. Эта настройка скорее нужна шаред хостингам, где могут быть злодеи и вообще всякие дэбилы.

И да, если у тебя, Медведь, шаред хостинг, то памяти ты больше не получишь, скорее всего. wink.gif Потому что странное число - 64, по умолчанию обычно идет 128.
Миша
Сегодня на своём ПК запустил, увеличивая через настройки memory_limit, оказалось что для этой фотографии нужно 154 MB.


_____________
Принимаю заказы, писать в ЛС
Миша
Цитата (sergeiss @ 27.04.2016 - 17:44)
Потому что эксепшен надо.

Не получится поймать исключение (try - catch) при Out of memory

Сделал так:
function DefaultFunction() {
$error = error_get_last();
if ($error[type]==1) {
echo "Обработка ошибки";
}
}

register_shutdown_function('DefaultFunction');


Может кто то ещё идеи подкинет?

_____________
Принимаю заказы, писать в ЛС
killer8080
попробуй Imagick вместо GD
Или вообще переложи ресайз на JS
Zzepish
killer8080
Imagick более грамотно расходует ресурсы?
Invis1ble
Цитата (killer8080 @ 30.04.2016 - 22:38)
Или вообще переложи ресайз на JS
Ron
Цитата (Invis1ble @ 1.05.2016 - 04:20)
самое грамотное решение

Парни, библиотеку хорошую посоветуйте? Давно хотел ознакомиться с JS ресайзом. Нефиг нагружать ресурсы сервера, тем более, что зачастую у людей дома компы гораздо мощнее наших VPS-ок.
Миша
УЯЗВИМОСТЬ В IMAGEMAGICK

_____________
Принимаю заказы, писать в ЛС
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.