Laravel Octane + Swoole大文件上传内存耗尽问题求助
解决Laravel Octane大文件上传内存耗尽问题
问题背景
已配置Swoole的package_max_length为100M,PHP上传相关参数也调整为支持100M文件,但上传30M以上文件时触发内存耗尽错误:
Allowed memory size of 134217728 bytes exhausted (tried to allocate 1048576 bytes)
报错文件:/var/www/vendor/symfony/mime/FileinfoMimeTypeGuesser.php第60行
解决方案
1. 提升PHP内存限制
当前128M的内存限制无法覆盖大文件MIME类型检测的内存需求:
- 修改
php.ini文件,设置memory_limit = 256M(或更高如512M),重启Octane与PHP服务。 - 若无法修改全局配置,可在Laravel项目
bootstrap/app.php中临时设置:ini_set('memory_limit', '256M'); - 或在Octane启动命令中追加参数:
php artisan octane:start --server=swoole --memory-limit=256M
2. 优化MIME类型检测逻辑
Symfony的FileinfoMimeTypeGuesser默认会读取大量文件内容用于MIME检测,大文件场景下会占用过多内存。可替换为基于扩展名的猜测器:
- 在
config/app.php中注册自定义MIME猜测器:use Symfony\Component\Mime\MimeTypeGuesserInterface; use Symfony\Component\Mime\ExtensionGuesser\ExtensionMimeTypeGuesser; $app->bind(MimeTypeGuesserInterface::class, function () { return new ExtensionMimeTypeGuesser(); });
3. 配置Octane进程自动重启
Octane常驻进程易因内存累积触发耗尽,设置进程重启阈值:
- 在
config/octane.php中调整Swoole配置:'swoole' => [ 'options' => [ 'package_max_length' => 100 * 1024 * 1024, 'max_request' => 100, // 处理100个请求后自动重启进程 ], ],
4. 流式处理上传文件
确保业务代码中避免将整个文件加载到内存,采用流式操作:
- 替换
file_get_contents为分段读取:$handle = fopen($request->file('upload')->getPathname(), 'r'); while (!feof($handle)) { $chunk = fread($handle, 8192); // 处理分片内容逻辑 } fclose($handle);
内容的提问来源于stack exchange,提问作者R. Pêgo
相关产品推荐
相关产品推荐

