You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:30:42