PHP memory_limit и размер $_FILES

Когда я пытаюсь загрузить файл, я проверяю размер файла следующим образом:

if($_FILES['attachment_file']['size'] > (1024 * 1024 * 20)) // 20 MB
{
echo 'The file is too big !'; exit();
}

И в моем файле htaccess у меня есть:

php_value memory_limit 21M
php_value max_execution_time 300
php_value upload_max_filesize 21M
php_value post_max_size 21M

Итак, я проверяю с помощью php, если файл имеет более 20 МБ, затем останавливаю скрипт. Но ошибка "Файл слишком большой!" не показывает...

В журнале ошибок php я получаю сообщение об ошибке "Разрешенный объем памяти 22020096 байт исчерпан".

Если я изменю (1024 * 1024 * 20) в (1024 * 1024 * 10)Работает как положено. PHP поймает ошибку и покажет мне сообщение: "Файл слишком большой!".

В чем проблема? Почему не работает с 20 МБ?

PS: я проверяю phpinfo, чтобы увидеть, взят ли конфиг из htaccess, и все в порядке.

3 ответа

Если вы используете imagecreatefromjpeg()Я подозреваю, что ему нужно выделить достаточно памяти для хранения необработанных данных пикселей из исходного изображения. То есть загрузка изображения 10x10 потребует 10*10*3 = 300 байт памяти или больше только для данных пикселей. Учитывая размер JPEG, я подозреваю, что у вас очень большое изображение. Размер этих пиксельных данных плюс любые накладные расходы PHP могут превысить пределы вашей памяти, особенно если вы выполняете какие-либо манипуляции, помимо чтения и сохранения.

Вы должны убедиться, что все следующие переменные установлены правильно:

upload_max_filesize - max size of any individual file in an upload
max_file_uploads - total number of files allowed to be uploaded
post_max_size - sum total of all data being POSTed (form data + files)
memory_limit - must be > post_max_size, to allow space for PHP + script overhead

@ref: загрузка не работает правильно, когда файл слишком большой

и избавиться от этого состояния

if($_FILES['attachment_file']['size'] > (1024 * 1024 * 20)) // 20 MB
{
echo 'The file is too big !'; exit();
}

Попробуйте увеличить лимит памяти в.htaccess выше 21 МБ, чтобы учесть время выполнения приложений, или используйте это в PHP:

ini_set('memory_limit', '128M');
Другие вопросы по тегам