Trato de imprimir un gran bloque JSON (100k) en el navegador, pero el servidor falla sin ningún error.
Por ejemplo:
echo 'var config = ' . json_encode( $config ) . ';' . PHP_EOL;
Descubrí que si envío una pequeña pieza, está bien. Descubrí que si coloco saltos de línea en la cadena JSON, está bien incluso si la cadena es de 400k.
Por ejemplo:
$config_json = json_encode( $config ); $config_json = str_replace( '},', '},' . PHP_EOL, $config_json ); echo 'var config = ' . $config_json . ';' . PHP_EOL;
Pero las líneas de corte rompen mi JSON.
Entonces, si se trata de una configuración de búfer, ¿por qué PHP_EOL ayuda?
También intenté dividir el JSON en partes como aquí: https://stackoverflow.com/a/19156563/1009525 , pero sin éxito, solo me ayudan las líneas de corte.
mientras escribes
el servidor falla sin un error
Supongo que quiere decir que el servidor envía una respuesta al cliente (código de estado: 200 - sin error), pero el cuerpo de la respuesta (el contenido) está vacío (este es el error).
Debería verificar esto porque si en realidad el servidor envía una respuesta con contenido, entonces el problema no es con php, nginx o almacenamiento en búfer.
De lo contrario (como se sugiere en los comentarios), tal vez el JSON en lugar de dentro de un bloque <script> - </script> puede estar envuelto entre las etiquetas <pre> y este podría ser el problema (pero no puedo ayudar a menos que publique más de su código).
De ahora en adelante asumo que la respuesta enviada desde el servidor está vacía
El código que publicó es válido y se supone que debe manejar correctamente la cadena de salida que está creando (que está muy por debajo de los límites de PHP).
Dijo que parece un problema de almacenamiento en búfer extraño. Escribo "raro" porque, hasta donde yo sé (y también me tomé el tiempo para investigar un poco), el almacenamiento en búfer no debería verse influenciado por los saltos de línea.
Descubrí que si coloco saltos de línea en la cadena JSON, está bien incluso si la cadena es de 400k.
Una solución rápida para resolver su problema es generar un JSON válido con saltos de línea. Solo necesita especificar una opción para json_encode :
echo 'var config = ' . json_encode( $config, JSON_PRETTY_PRINT ) . ';' . PHP_EOL; JSON_PRETTY_PRINT le dice a json_encode que formatee el json para que sea más legible y al hacerlo se agregarán saltos de línea.
(Tenga en cuenta que esta opción está disponible para PHP 5.4.0 y superior)
Espero que la solución anterior te funcione.
De todos modos, le sugiero encarecidamente que investigue más a fondo el problema para que el código original también funcione.
Primero, debe asegurarse de estar ejecutando una versión reciente y estable de nginx y php .
Luego verificaría el archivo de configuración de nginx, la configuración de php-fpm (si está usando php-fpm) y finalmente la configuración de php.
Compruebe también los registros de errores de php, nginx y php-fpm.
intente usar php heredoc para repetir http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
En caso de que no tenga la versión de PHP > 5.4.0 instalada en su servidor, una solución rápida podría ser algo como esto. El siguiente fragmento funciona para una matriz de prueba. La prueba inicial fue con una matriz de 250Kb. Como no puedo publicar la matriz de prueba real, aquí hay un enlace de prueba con un ejemplo más pequeño. Sin embargo, es el resultado de JSON_PRETTY_PRINT .
$out = json_encode($arr,JSON_FORCE_OBJECT); $out = str_replace( ':{', ':' . PHP_EOL . ' ' . '{', $out ); $out = str_replace( '},', PHP_EOL . ' },', $out ); $out = str_replace( ',', ',' . PHP_EOL . ' ', $out ); $out = str_replace( '},' . PHP_EOL . ' ', '},' . PHP_EOL . ' ', $out ); $out = str_replace( '}}', PHP_EOL . ' }' . PHP_EOL . '}', $out ); echo $out;