Laravel 3 - POST Content-Length Exception
Запуск Laravel 3.
Я пытаюсь загрузить файлы с помощью фреймворка Laravel. Если файл больше, чем параметр php для upload_max_filesize
это исключение ниже.
Я пробовал это в моем контроллере и маршрутах безуспешно (if
оператор выполняется - он устанавливает сеанс - но исключение все еще выдается, показывая страницу ошибки)
if ($_SERVER['CONTENT_LENGTH'] > 8380000) {
//do stuff here because its too big
// set a session and exit()
}
Как я могу предотвратить появление этого исключения, не увеличивая ограничения памяти php?
Ошибка:
Unhandled Exception
Message:
POST Content-Length of 9306598 bytes exceeds the limit of 8388608 bytes
Location:
Unknown on line 0
Как примечание, этот вопрос задавался по крайней мере дважды на форуме laravel, но не было дано хорошего ответа, кроме как "увеличить ограничения памяти php".
РЕДАКТИРОВАТЬ: проблема, кажется, в том, что Laravel загружает все _POST
входы, прежде чем я смог даже проверить их в маршруте или контроллерах. Похоже, ошибка для меня.
2 ответа
Это похоже на максимальный размер сообщения PHP, который по умолчанию составляет 8 МБ во многих системах (около 8388608 байт). В Laravel вы ничего не можете сделать, чтобы обойти это, поскольку он обрабатывается / управляется / настраивается на уровне PHP. Прочтите статью Увеличение максимального размера сообщения, чтобы узнать, как это изменить.
PHP выдает это предупреждение, а Laravel считает его фатальной ошибкой. Это сделано в Error::shutdown
любая сгенерированная ошибка PHP приведет к закрытию приложения из-за этой ошибки.
Решение, которое я нашел, состоит в том, чтобы отфильтровать, какие типы ошибок могут заканчиваться Error::shutdown
,
Недостатком является:
- Необходимо изменить файл laravel:
laravel/laravel.php
что не очень хорошая идея, если вы планируете обновить laravel новыми версиями (что вряд ли произойдет сейчас, когда выйдет версия 4.1). - Не удалось полностью проверить, если это подразумевает некоторый побочный эффект в поведении Laravel, не прерывая ошибки предупреждения.
Это изменение, которое я сделал в файле laravel/laravel.php
строка 46:
register_shutdown_function(function()
{
require_once path('sys').'error'.EXT;
$error = error_get_last();
if ( $error!==null )
{
if( $error['type']!=E_WARNING )
{
Error::shutdown();
}
}
});