Laravel尝试上传非常大的文件时在本地主机上内存不足

时间:2018-08-28 14:39:22

标签: php laravel laravel-5 phpmyadmin

我正在尝试上载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

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

1 个答案:

答案 0 :(得分:0)

我将检查您的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');
    }