Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

288
Vistas
No se puede generar un bloque de cadena grande sin líneas de ruptura (nginx+php)

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.

about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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.

about 4 years ago · Santiago Trujillo Denunciar

0

intente usar php heredoc para repetir http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

about 4 years ago · Santiago Trujillo Denunciar

0

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;
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda