【问题标题】:Laravel Out of memory on localhost when trying to upload very big file尝试上传非常大的文件时,Laravel 本地主机内存不足
【发布时间】:2019-02-03 05:49:48
【问题描述】:

我正在尝试上传 csv 文件,以便将这些数据上传到数据库中。 代码如下

public function upload(Request $request){
        set_time_limit(0);
        ini_set('MAX_EXECUTION_TIME', 36000);
        $file = Input::file('file');
        $filePath = $file->getRealPath();

       $handle = fopen($filePath, "r");
        while(!feof($handle))
        {
           << DO THE DATABASE OPERATION >>
        }
        fclose($handle);

  return redirect()->back()->with('success', 'File uploaded successfully');
}

如果文件大小小于 100 或 200mb,这可以正常工作。但是当文件大小像2GB这样大时。它关闭本地服务器。在控制台中,它说内存不足

我的 php.ini 设置是:

post_max_size=10000M
upload_max_filesize=10000M

我的系统配置:

64位窗口机

问题

不仅上传失败,还关闭了开发服务器,即localhost:8000

谁能告诉我为什么会这样,我该如何解决。 我确实像这样在 StackOverflow 上关注了几个线程

phpMyAdmin: Can't import huge database file, any suggestions?

Large file uploads failing php

Laravel out of memory issue?

Uploading a file larger than 2GB using PHP

但不幸的是,这些解决方案没有帮助。

【问题讨论】:

  • 是的,同样的问题,但这些解决方案不起作用。请检查我的 php.ini 设置。我确实已经应用了这些解决方案。我要上传的文件是 1.6GB,所以应用程序关闭本地服务器没有任何意义。
  • 编辑您的 Apache 配置非常快;) 您正在运行什么版本的 PHP?文件是 2GB 还是 1.6GB?
  • 这不是快速编辑,以防万一你没有注意到,我在发布这个问题时添加了 php.ini 设置。我正在使用 php 7.1 。我要上传的文件是 1.6GB,我还有另一个文件是 4.3GB。我想同时上传它们
  • 好的,memory_limit 的配置值是多少?

标签: php laravel laravel-5 phpmyadmin


【解决方案1】:

我会检查您的 Windows 事件查看器以尝试找出服务器崩溃的原因。希望这能让您对问题所在有所了解。

如果您找不到崩溃的根源,并且由于您使用的是 7.1 和大文件,请尝试使用生成器处理文件。您正在将整个内容加载到内存中。即使 memory_limit 的值很大,我仍然认为将整个文件加载到内存中可能是您​​的问题。

http://php.net/manual/en/language.generators.php

这将逐行流式传输,但您可以找到其他允许您对文件进行分块的示例。

public function read_file($file)
{
    $fp = fopen($file, 'r');

    while(($line = fgets($fp)) !== false)
        yield $line;

    fclose($fp);
}  

public function upload(Request $request){
            set_time_limit(0);
            ini_set('MAX_EXECUTION_TIME', 36000);
            $file = Input::file('file');
            $filePath = $file->getRealPath();

            foreach(read_file($filePath) as $line)
            {
               << DO THE DATABASE OPERATION >>
            }

      return redirect()->back()->with('success', 'File uploaded successfully');
    }

【讨论】:

  • 感谢 erik 的建议。我会试试看 :))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多