错误内容如下:
[2021-12-21 02:09:13] production.ERROR: Allowed memory size of 134217728 bytes exhausted (tried to allocate 982239704 bytes) {"exception":"[object] (Symfony\\Component\\ErrorHandler\\Error\\FatalError(code: 0): Allowed memory size of 134217728 bytes exhausted (tried to allocate 982239704 bytes) at /xxx/xxxx.com/vendor/league/mime-type-detection/src/FinfoMimeTypeDetector.php:68)
原因是这个包在检测文件类型的时候是吧所有内容拿进去检测,如果上传的内容过大,就会报内存使用超限.这里我们可以设置一下逻辑,如果内容超过某个限度,我们就直接根据文件path进行判断mime_type,由于我这里是后台应用,因此可以这么处理.
#D:\xxxx\vendor\league\flysystem\src\Util.php
/**
* Guess MIME Type based on the path of the file and it's content.
*
* @param string $path
* @param string|resource $content
*
* @return string|null MIME Type or NULL if no extension detected
*/
public static function guessMimeType($path, $content)
{
#设置超过50M就不走这个逻辑
if (strlen($content) < 50*1024*1024) {
$mimeType = MimeType::detectByContent($content);
}
if ( ! (empty($mimeType) || in_array($mimeType, ['application/x-empty', 'text/plain', 'text/x-asm']))) {
return $mimeType;
}
return MimeType::detectByFilename($path);
}
调整文件上传限制
打开php.ini,首先找到
file_uploads = on ;是否允许通过HTTP上传文件的开关。默认为ON即是开
upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_max_filesize = 8m ;望文生意,即允许上传文件大小的最大值。默认为2M
post_max_size = 8m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
一般地,设置好上述四个参数后,上传<=8M的文件是不成问题,在网络正常的情况下。
但如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。
进一步配置以下的参数
max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M
把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了
max_execution_time = 600
max_input_time = 600
memory_limit = 32m
file_uploads = on
upload_tmp_dir = /tmp
upload_max_filesize = 32m
post_max_size = 32m
nginx可能也需要配置
在nginx配置里面写上下面的配置:
client_max_body_size 1024M; 上传文件大小限制
sendfile on; 设置为on表示启动高效传输文件的模式
keepalive_timeout 1800;保持连接的时间,默认65s