Предупреждение PHP сносит ответ JSON

Я реализую загрузку файла ajax для моего php-приложения (используя CodeIgniter).

Я обнаружил, что загруженные данные POST слишком велики (>post_max_size) в соответствии сhttp://andrewcurioso.com/2010/06/detecting-file-size-overflow-in-php/ и попробуйте отправить соответствующий код ошибки в формате JSON.

Но соответствующее предупреждение php, включенное в вывод, полностью разрушает мой ответ JSON!

<br>
Warning:  POST Content-Length of 105906405 bytes exceeds the limit of 8388608 bytes in Unknown on line 0<br>
[{"error":"Posted data is too large. 105906405 bytes exceeds the maximum size of 8388608 bytes."}]

Я неЯ не хочу анализировать и отфильтровывать предупреждение на стороне клиента, что кажется уродливым. И отключение всех предупреждений php во всем мире кажется неуместным.

Могу ли я отключить определенные предупреждения PHP в контексте функции php? Или обернуть его в действительный ответ JSON?

 lonesomeday13 окт. 2012 г., 13:10
В любом случае, в вашей производственной среде ошибки должны быть отключены ...
 Thomas B.13 окт. 2012 г., 13:19
@onemesday Я согласен, но указанное поведение "дать отзыв пользователю, если он попытается загрузить слишком большие файлы должно быть одинаковым в среде производства и разработки / тестирования. Я'я не фанатДа, но в производственном режиме это работает! ;)
 xception13 окт. 2012 г., 13:54
Обычно ошибки в строке 0 являются ошибками запуска, добавляяphp_flag display_startup_errors off на ваш .htaccess должен отключить его ... добавил, что к моему ответу.

Ответы на вопрос(4)

Вы можете установить пользовательский обработчик ошибок:http://www.php.net/manual/en/function.set-error-handler.php

Вы также можете использовать функции буферизации вывода, чтобы обернуть его. ,ob_startob_end_flush и другие.

Тем не менее, всегда лучше иметь PHPerror_reporting установлен вfalse в производственных системах, затем перехватывайте ошибки и переносите их в свой JSON.I '

 Bart Friederichs13 окт. 2012 г., 13:26
Неплохо. Кажется, ваша конкретная проблема больше связана с сервером, чем с сценарием. Единственное, о чем я могу думать сейчас, - отключить предупреждения в скрипте.
 Thomas B.13 окт. 2012 г., 13:22
Я хотел бы использовать пользовательский обработчик событий, но документация ваших опубликованных ссылок гласит:> Если ошибки возникают до выполнения скрипта (например, при загрузке файла), пользовательский обработчик ошибок не может быть вызван, поскольку он не зарегистрирован в это время.

У меня была та же проблема с реализацией скрипта загрузки, который требует связи с вызывающим скриптом. Некоторые предупреждения php повредили выходной отклик.

Я прибег к функциям буферизации вывода php. Вот как я избавился от выводимых предупреждений:

ob_start(); // start output buffering (we are at the beginning of the script)

[ ... ] // the script actual functionality is unchanged

ob_end_clean(); // this clears any potential unwanted output

exit($my_json_encoded_response); // and this just outputs my intended response

Это решило мою проблему.

На рабочем сервере: Всегда отключайте php-предупреждения.

На разработке машина: Отключите все предупреждения для этой страницы с целью тестирования и повторно включите после завершения тестирования и подтверждения функциональности как работающей.

намекЯ предпочитаю иметь переменную глобально и в зависимости от этого включить или отключить все предупреждения php и базы данных. Вы можете установить это в.htaccess например, если вы используете Apache. У меня есть это в:.htaccess

производство:SetEnv DEVELOPMENT Offразвитие:SetEnv DEVELOPMENT On

И в коде php:

if( strtolower(getenv('DEVELOPMENT')) == "on" ) {
        ini_set("display_errors",2);
        ini_set('error_reporting', E_ALL | E_STRICT);
}

Чтобы отключить все ошибки из .htaccess используйте

php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0

Если вы хотите быть действительно хитрым, вы можете добавить проверку вроде:

if(error_get_last() !== null)

и установите заголовок http и проверьте это из javascript как для вывода json, так и при загрузке вашей страницы, и посмотрите журнал ошибок или отобразите ошибку на экране, если вы предпочитаете это, тем не менее, я настоятельно рекомендую отключить отображение ошибки в производственная среда.

Для более глубокого разговора об этом взгляните наЭта статья.

 xception13 окт. 2012 г., 13:58
@BartFriederichs Один из двух предложенных мною способов должен сработать, проверьте в последней части моего ответа способ, чтобы оба имели какое-то сообщение об ошибке, и оно не влияло на ваш вывод напрямую!
 Bart Friederichs13 окт. 2012 г., 13:30
Я полностью согласен, но код должен в конечном итоге нормально работать сdisplay_errors установлен вon, И в этом конкретном случае это неКажется, это возможно.
 xception13 окт. 2012 г., 13:34
@BartFriederichs Отключить отчеты об ошибках из php.ini или .htaccess. Это должно работать. Добавлен код для этого в моем ответе.

Или вы можете просто изменить максимальный размер сообщения в файле php.ini:

post_max_size = 10M //change this line to whatever fits your needs

Но в зависимости от того, что пользователи должны загружать, вы должны также попытаться проверить размер файлов, которые ониповторная загрузка.

 Thomas B.13 окт. 2012 г., 13:21
Но это незапретить пользователям отправлять файлы размером "post_max_size + 1 "

Ваш ответ на вопрос