PHP Предупреждение разрушает ответ JSON

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

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

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

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

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

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

Solutions Collecting From Web of "PHP Предупреждение разрушает ответ JSON"

На рабочем сервере: всегда отключите 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, так и при загрузке вашей страницы, и посмотрите на журнал ошибок или отобразите ошибку на экране, если вы этого предпочтете, я настоятельно рекомендую вам отключить ошибку, отображающую код в производственной среды.

Более подробные сведения об этом см. В этой статье .

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

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

Тем не менее, всегда лучше, чтобы PHP error_reporting устанавливался в false в производственных системах, затем ломал ошибки и завернул их в ваш JSON.

У меня была такая же проблема с реализацией сценария загрузки, который требует обратной связи с вызывающим скриптом. Некоторые предупреждения 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 

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

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

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

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