[POST正文大小大于100kb时发生500内部服务错误

问题描述 投票:0回答:1

我有一个在laravel / lumen框架v5.4.6上运行的API,并且我正在使用它来从游戏服务器中提取信息(二进制)并将其转换为json。一切运行正常,但有时在特定请求下我发现了错误。我花了一段时间才找出造成此问题的真正原因,我想我找到了。

因此,我使用Postman并进行了多次测试,发现当POST响应大小超过100 kB时,就会发生错误。

出现此异常是500内部服务错误:

(1/1) ErrorException
unpack(): Type C: not enough input, need 1, have 0

我针对此类问题在Google上投入了很多精力,因此我尝试增加php memory_limit,post_max_size,upload_max_filesize,max_input_vars的值,但错误仍然存​​在。

真的很奇怪。如果POST请求的响应大小为

UPDATE:

我有一些进步!

我在localhost(使用xampp)上进行了测试,但不会发生该错误!现在,它可以正确加载所有内容,甚至包括大小超过100kB的请求。我想这意味着它可能来自Web服务器的配置?会是什么呢?我切换了多个PHP版本,重新安装了apache2服务器等。非常感谢您的帮助。

UPDATE 2:

这是发生错误的确切代码。

   public static function unmarshal(&$rb, $struct)
    {
        $data = array();
        foreach ($struct as $key => $val) {
            if (is_array($val)) {
                if (self::$cycle) {
                    if (self::$cycle > 0) {
                        for ($i = 0; $i < self::$cycle; $i++) {
                            $data[$key][$i] = self::unmarshal($rb, $val);
                            if (!$data[$key][$i])
                                return false;
                        }
                    }
                    self::$cycle = false;
                } else {
                    $data[$key] = self::unmarshal($rb, $val);
                    if (!$data[$key])
                        return false;
                }
            } else {
                $tmp = 0;
                switch ($val) {
                    case 'int':
                        $un = unpack("N", substr($rb, 0, 4));
                        $rb = substr(str_pad($rb, 4, 0, STR_PAD_LEFT), 4);
                        $data[$key] = $un[1];
                        break;
                    case 'int64':
                        $un = unpack("J", substr($rb, 0, 8));
                        $rb = substr($rb, 8);
                        $data[$key] = $un[1];
                        break;
                    case 'lint':
                        //$un = unpack("L", substr($rb,0,4));
                        $un = unpack("V", substr($rb, 0, 4));
                        $rb = substr($rb, 4);
                        $data[$key] = $un[1];
                        break;
                    case 'byte':
                        $un = unpack("C", substr($rb, 0, 1));
                        $rb = substr($rb, 1);
                        $data[$key] = $un[1];
                        break;
                    case 'byte2':
                        $un = unpack("C", substr($rb, 0, 1));
                        $rb = substr($rb, 1);
                        $data[$key] = $un[1];
                        self::$cycle = $data[$key];
                        break;
                    case 'cuint':
                        $cui = self::unpackCuint($rb, $tmp);
                        $rb = substr($rb, $tmp);
                        if ($cui > 0)
                            self::$cycle = $cui;
                        else
                            self::$cycle = -1;
                        break;
                    case 'octets':
                        $data[$key] = self::unpackOctet($rb, $tmp);
                        $rb = substr($rb, $tmp);
                        break;
                    case 'name':
                        $data[$key] = self::unpackString($rb, $tmp);
                        $rb = substr($rb, $tmp);
                        break;
                    case 'short':
                        $un = unpack("n", substr($rb, 0, 2));
                        $rb = substr($rb, 2);
                        $data[$key] = $un[1];
                        break;
                    case 'short2':
                        $un = unpack("n", substr($rb, 0, 2));
                        $rb = substr($rb, 2);
                        $data[$key] = $un[1];
                        self::$cycle = $data[$key];
                        break;
                    case 'lshort':
                        $un = unpack("v", substr($rb, 0, 2));
                        $rb = substr($rb, 2);
                        $data[$key] = $un[1];
                        break;
                    case 'float2':
                        $un = unpack("f", substr($rb, 0, 4));
                        $rb = substr($rb, 4);
                        $data[$key] = $un[1];
                        break;
                    case 'float':
                        $un = unpack("f", strrev(substr($rb, 0, 4)));
                        $rb = substr($rb, 4);
                        $data[$key] = $un[1];
                        break;
                }
                if ($val != 'cuint' and is_null($data[$key]))
                    return false;
            }
        }
        return $data;
    }
php json api binary lumen
1个回答
0
投票

默认post_max_size为'8M'。如果您在实时服务器上,则可能会更改此设置,但在任何平台上我都找不到小于100kb的大小。

所以,我认为这不是错误。但是,要通过在app / Providers / AppServiceProvider引导功能中设置这些值来覆盖php的默认上传大小:

    ini_set('post_max_size', '10M');

您可能会从link中找到一些解决方案

© www.soinside.com 2019 - 2024. All rights reserved.