我有一个在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;
}
默认post_max_size为'8M'。如果您在实时服务器上,则可能会更改此设置,但在任何平台上我都找不到小于100kb的大小。
所以,我认为这不是错误。但是,要通过在app / Providers / AppServiceProvider引导功能中设置这些值来覆盖php的默认上传大小:
ini_set('post_max_size', '10M');
您可能会从link中找到一些解决方案