我从客户端(使用curl和自定义nodejs脚本测试)发送POST请求,没有正确回应响应。整个事情适用于PHP 5.6。

环境

整个事情尽可能地减少:

>一切运行在Vagrant VM Ubuntu 14.04 LTS

> nginx 1.9.7 from http://nginx.org/packages/ubuntu/

> PHP7 FPM从官方来源编译–disable-all –enable-fpm

我使用的最小nginx网站配置:

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;

}

}

来自/vagrant/index.php的PHP脚本示例:

echo str_repeat('.', 512);

flush(); // not necessary, only due testing

curl调用我使用:curl -XPOST http:// localhost / -H“传输编码:chunked”-d’

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();

将我的测试请求发送到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

将我的测试请求发送到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

为什么我要分块编码?

没有商业理由这样做,但我使用非常类似的NodeJS代码,默认为分块编码,突然停止工作时切换到PHP7。

我发现以下工作从nodejs侧:显式设置Content-Length标头删除由NodeJS发送的隐式Transfer-Encoding:chunked头,因此适用于两个PHP版本。

但是我想了解为什么PHP7在这里行为不同,以及我是错误的还是这里真正发生了什么。

更新1:

>我比较了sapi / fpm /源5.6和7.0之间,几乎没有什么区别,我可以发现除了由于PHP内部的变化

>内置服务器(php -S)不受影响,所有测试

更新2:

我平分PHP源,并能够精确定位当行为改变:

在中间,从git bisect输出,提交我无法编译:

$ 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!

php 返回http chunked,POST请求到PHP7与chunked编码不正确返回结果相关推荐

  1. SpringMVC总结三:请求Controller返回视图类型以及请求方式、参数介绍

    视图解析,请求Controller返回的视图类型: @Controller @RequestMapping("/test") public class TestController ...

  2. Spring MVC 执行过程原理(请求映射原理、参数处理原理、返回值处理器)

    Spring MVC 执行过程分析 文章目录 Spring MVC 执行过程分析 请求映射原理 适配器Adapter 执行目标方法 参数处理器解析器HandlerMethodArgumentResol ...

  3. java http 返回json_java发起http请求获取返回的Json对象方法

    话不多说,先看代码! /** * Created by david on 2017-7-5. */ import com.google.gson.JsonObject; import com.goog ...

  4. action请求_深圳嘉华学校之Action方法返回类型

    Action方法返回类型 . Action方法返回类型 . Void . 简单或复杂类型 . HttpResponseMessage . IHttpActionResult . 自定义返回类型 在前面 ...

  5. springboot控制接口返回的字段_SpringBoot实战:SpringBoot之Rest Full接口自定义返回数据类型(ResponseBodyAdvice)...

    我们在日常开发的过程中,经常会要求统一返回数据格式.如要求统一访问格式为 { "success": 请求是否成功, "message": 请求消息, " ...

  6. 爬虫实战学习笔记_3 网络请求urllib模块:设置IP代理+处理请求异常+解析URL+解码+编码+组合URL+URL连接

    1 设置IP代理 1.1 方法论述 使用urllib模块设置代理IP是比较简单的,首先需要创建ProxyHandler对象,其参数为字典类型的代理IP,键名为协议类型(如HTTP或者HTTPS),值为 ...

  7. php chunked trailer header,HTTP协议之Chunked解析

    在网上找了好一会,始终没发现有解析Chunked编码的文章,那就自己写一个吧,呵呵. 网上使用Chunked编码的网站似乎并不是很多,除了那些使用GZip压缩的网站,例:google.com,还有就是 ...

  8. WebAPi之SelfHost自创建证书启动Https疑难解惑及无法正确返回结果

    前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...

  9. php递归函数return会出现无法正确返回想要值的情况

    php递归函数中使用return的时候会碰到无法正确返回想要的值得情况,如果不明白其中的原因,很难找出错误的,就下面的具体例子来说明一下吧: 1 2 3 4 5 6 7 8 9 function te ...

最新文章

  1. SpringBoot+Shiro学习(八):RememberMe
  2. SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载)
  3. boost::type_erasure::equality_comparable相关的测试程序
  4. 三维重建:SLAM的尺度和方法论问题
  5. 【实战 Ids4】║ 客户端、服务端、授权中心全线打通!
  6. extern C用法详解
  7. Docker安装MongoDB管理工具nosqlclient
  8. (转载)C中实参与形参的“值传递”只能“单向传送”(透彻的理解)
  9. 4、Spring Cloud-负载均衡 Ribbon
  10. 传智播客 多继承以及MRO顺序 学习笔记
  11. python 刷手机今日头条金币_刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码)...
  12. python爬取qq音乐歌词风变编程_爬取QQ音乐歌词
  13. html网页制作提交注册信息,利用HTML表单标签编写一个注册页面
  14. python是个坑_Python 有什么不为人知的坑?
  15. 正宇丨有钱,把日子过好;没钱,把心情过好
  16. MP2459被完美替代内部集成有功率MOSFET管FS2459的60V0.5A降压IC
  17. hdu 1276 士兵队列训练问题 (详解)
  18. 调用smooth函数进行加噪数据的平滑处理
  19. 纷享销客数字化营销能力(三):全渠道获客
  20. js:json请求和jsonp请求

热门文章

  1. Spring Boot 中的异步调用
  2. 人类基因组参考基因组
  3. CSP-S 2019 游记【完结】
  4. l4d2服务器修改武器伤害,装备属性和武器伤害的修改命令介绍
  5. 椭圆曲线加密原理与应用
  6. 还原计算机或重装windows,windows一键还原,教您怎么解决
  7. 考研APP软件开发实现功能
  8. 滤波算法-呼吸心跳信号检测方法(四)
  9. 设F是一个森林,B是由F变换来的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有(n+1)个。
  10. 第一个入门级的JavaWeb项目(IDEA)