Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

291
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda