记录一次事故

1,066 阅读1分钟

背景

用户提交的数据发现缺失了一部分。查询日志后发现是通过是在使用post请求时,PHP接收的数据少了,在使用content-type为application/x-www-form-urlencoded时会被截断数据。

修复方案

为保证用户能尽快使用,采用了application/json来应急。

疑问

在nginx日志中发现了数据是有提交的。但是PHP为什么没有接收到呢。

源头

在查询PHP文档后发现php.ini中有个配置叫:max_input_vars

影响了_GET,_POST,$_COOKIE,没有影响php://input

实验

  • PHP环境:7.1.29

  • 修改php.ini,将max_input_vars修改为5

  • 测试post,直接返回接收到数据

var_dump($_POST);

6个参数返回了5个。

  • 发现一个问题,PHP日志里面报错了(这个可以监控起来)

  • 试试将max_input_vars设置为0

没有数据了😂,所以不能设置为0

  • php://input会不会也有这样到限制呢?
    • 修改post_max_size试试。
    • 先来看未修改到效果
      • 先生成一个10000个key到数据
      $arr = [];
      for($index = 0; $index <= 10000; $index++) {
              $arr["key".$index] = $index;
      }
      
      echo json_encode($arr);
      
      • 提交测试
      • 记住数据大小:144kb
    • 修改post_max_size为10kb(默认为50M)
      • 再次提交数据
      • 结果还是返回了。(是不能设置kb吗,那设置为1M试试)
      • 再次提交试试(将数据复制10次)
      • 结果OK。
      • 说明对他没影响?
    • 再试试upload_max_filesize
    • emmmmm,还是成功了。

思考

  • php://input 就没有大小限制了吗?