Advertencia de PHP destruye la respuesta JSON

Estoy implementando una carga de archivo ajax para mi aplicación php (usando CodeIgniter).

Detecto si los datos POST cargados son demasiado grandes (> post_max_size) de acuerdo con http://andrewcurioso.com/2010/06/detecting-file-size-overflow-in-php/ y trato de enviar un error apropiado con encoding JSON respuesta.

¡Pero la advertencia php correspondiente incluida en la salida destruye por completo mi respuesta JSON!


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

No quiero analizar y filtrar la advertencia en el lado del cliente, eso parece feo. Y deshabilitar todas las advertencias de php a nivel mundial parece inapropiado.

¿Puedo deshabilitar advertencias PHP específicas en el contexto de una función php? ¿O envolverlo dentro de una respuesta json válida?

En el servidor de producción: deshabilite siempre las advertencias de php.

En la máquina de desarrollo: desactive todas las advertencias para esa página con el fin de probar y volver a habilitar después de que se complete la prueba y se confirme que la funcionalidad funciona.

Sugerencia : Prefiero tener una variable configurada globalmente y, dependiendo de eso, habilitar o deshabilitar todas las notificaciones de advertencia de php y base de datos. Puede establecer eso en .htaccess por ejemplo, si usa apache. Tengo esto en .htaccess :

  • producción: SetEnv DEVELOPMENT Off
  • desarrollo: SetEnv DEVELOPMENT On

Y en el código php:

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

Para deshabilitar todos los errores del uso de .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 

Si quieres ser realmente complicado, puedes agregar un cheque como:

 if(error_get_last() !== null) 

y establezca un encabezado http y verifique que desde JavaScript para la salida json y cuando cargue su página y eche un vistazo al registro de errores o muestre el error en la pantalla si lo prefiere, aún le recomiendo que desactive el error que muestra el código en el entorno de producción.

Para hablar más a fondo sobre esto, eche un vistazo a este artículo .

Puede configurar un manejador de errores definido por el usuario: http://www.php.net/manual/en/function.set-error-handler.php

También puede usar las funciones de almacenamiento en búfer de salida para envolverlo. ob_start , ob_end_flush y otros.

Sin embargo, siempre es mejor tener establecido el error_reporting PHP en sistemas de producción, luego detectar errores y envolverlos en su JSON.

Acabo de tener el mismo problema al implementar un script de carga que requiere comunicación de vuelta al script de llamada. Algunas advertencias de php estaban corrompiendo la respuesta de salida.

He recurrido a las funciones de buffer de salida php. Así es como me deshice de los mensajes de salida de advertencia:

 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 

Esto resolvió mi problema.

O simplemente puede cambiar el tamaño máximo de publicación en el archivo php.ini:

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

Pero, dependiendo de lo que carguen los usuarios, también debería intentar verificar el tamaño del archivo de los archivos que están cargando.