sintaxis etiquetas ejemplos codigo bloque php chunked-encoding php-7

ejemplos - etiquetas php pdf



La solicitud POST a PHP7 con codificación fragmentada no devuelve correctamente el resultado (2)

Es / fue un error en PHP7 que se corrigió recientemente con https://github.com/php/php-src/pull/1745 . Aún no se encuentra dentro de ningún lanzamiento oficial, pero eventualmente terminará ahí en algún momento.

Antes del PR anterior, también se informó un error que describe un problema similar: https://bugs.php.net/bug.php?id=71466

Estoy enviando una solicitud POST de un cliente (probado con curl y script personalizado de nodejs) y no recibo la respuesta correctamente. Todo funciona bien con PHP 5.6.

Ambiente

Todo se reduce lo más posible:

  • Todo funcionando dentro de Vagrant VM Ubuntu 14.04 LTS
  • nginx 1.9.7 de http://nginx.org/packages/ubuntu/
  • PHP7 FPM compilado de fuentes oficiales con --disable-all --enable-fpm

La configuración mínima del sitio nginx que estoy usando:

server { listen 80; server_name localhost; location / { fastcgi_param REQUEST_METHOD $request_method; fastcgi_pass unix:/var/run/php/php7.0-fpm-api.sock; fastcgi_param SCRIPT_FILENAME /vagrant/index.php; } }

Ejemplo de script PHP desde /vagrant/index.php :

<?php echo str_repeat(''.'', 512); flush(); // not necessary, only due testing

Estoy usando: curl -XPOST http://localhost/ -H "Transfer-Encoding: chunked" -d ''''

Estoy usando el script NodeJS:

''use strict''; var http = require(''http''); var url = require(''url''); var uri = url.parse(process.env.URL); var options = { method: ''POST'', protocol: uri.protocol, hostname: uri.hostname, port: uri.port, path: uri.path, }; var data = ''''; var httpRequest = http.request(options, function(res) { res.on(''data'', function(chunk) { console.log(''received data'', chunk.length); data += chunk; }); res.on(''end'', function() { console.log(''final size'', data.length); }); }) .on(''error'', function(err) { console.log(err); }); httpRequest.write(''''); httpRequest.end();

Enviando mis solicitudes de prueba a PHP 5.6

$ curl http://localhost/ ..........[cut off] $ curl -XPOST http://localhost/ -H "Transfer-Encoding: chunked" -d '''' ..........[cut off] $ URL=http://localhost/ node php7test.js received data 512 final size 512

Enviando mis solicitudes de prueba a PHP 7.0

$ curl http://localhost/ ..........[cut off] $ URL=http://localhost/ node php7test.js final size 0 $ curl -XPOST http://localhost/ -H "Transfer-Encoding: chunked" -d '''' curl: (18) transfer closed with outstanding read data remaining

¿Por qué estoy perdiendo el tiempo con la codificación fragmentada?

No hay ninguna razón comercial para hacerlo, sin embargo, estaba usando un código NodeJS muy similar que de forma predeterminada es una codificación fragmentada que de repente dejó de funcionar al cambiar a PHP7.

Descubrí que lo siguiente funciona desde el lado de nodejs: la configuración explícita de un encabezado Content-Length elimina el Transfer-Encoding: chunked implícito Transfer-Encoding: chunked encabezado Transfer-Encoding: chunked enviado por NodeJS y, por lo tanto, funciona con ambas versiones de PHP.

Sin embargo, me gustaría entender por qué PHP7 se comporta de manera diferente aquí y si estoy equivocado o lo que realmente está sucediendo aquí.

Actualización 1:

  • Comparé el sapi/fpm/ sources entre 5.6 y 7.0 y casi no hay diferencia que pude detectar, excepto los cambios debidos a los cambios internos de PHP
  • El servidor incorporado ( php -S ) no se ve afectado, todas las pruebas

Actualización 2:

Divisé las fuentes de PHP y pude identificar cuándo cambió el comportamiento:

En medio, salida de git bisect , confirmaciones que no pude compilar:

$ git bisect skip There are only ''skip''ped commits left to test. The first bad commit could be any of: ba5ecf355fe792a5a2a8e6582d5e081d02b16fbf e383cb4493031a7cd952cfcaed3297e583149c07 fef18f4bea1980a59a9283c2197bd090aaf500cb 18cf4e0a8a574034f60f4d123407c173e57e54ec We cannot bisect more!

Teniendo la sensación de que esto podría ser un error, escribí esto en el interior, tal vez tengan algunas ideas: https://marc.info/?l=php-internals&m=145090900217798&w=2


Por tu post supongo que estás usando PHP7.0.0 . Si mi suposición es (bool) VERDADERA, sugeriré que migre a PHP7.0.1 .

PHP7.0.0 tiene aproximadamente 27 errores que fueron aplastados en PHP7.0.1 ; entre otros elementos fijos.
Fuente: PHP.net changelog .


También miré tu código PHP arriba (con mis gafas de google) pero es ridículamente simple. Dudo que algo pueda estar mal con eso. Aunque supongo que tiene que ver con la forma en que PHP7 maneja flush () y las salidas.


Además:

Tomando nota de sus actualizaciones (específicamente la Actualización 1 y la Actualización 2 ); Realmente debo felicitarte allí! ESTO ES MUY IMPRESIONANTE . Asegúrese de revisar este error corregido #61751 . Si estaba en lo cierto acerca de su versión de PHP, entonces este error corregido podría haber resuelto su problema; solo necesitarás migrar a PHP7.0.1 .


NOTA: Sé que debo revisar las partes internas del error corregido pero ...