Laravel Недостаточно памяти на локальном хосте при попытке загрузить очень большой файл - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь загрузить 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 или 200 МБ. Но когда размер файла большой, как 2 ГБ. Закрывает локальный сервер. В консоли написано нехватка памяти

Мои настройки php.ini:

post_max_size=10000M
upload_max_filesize=10000M

Моя системная конфигурация:

Оконный станок 64 бит

Задача

Не только невозможно загрузить, но и закрыть сервер разработки, т.е. localhost:8000

Может кто-нибудь сказать, пожалуйста, почему это происходит и как я могу это исправить. Я следил за несколькими потоками в StackOverflow, как это

phpMyAdmin: Не удается импортировать огромный файл базы данных, какие-либо предложения?

Ошибка загрузки большого файла php

Проблема с нехваткой памяти?

Загрузка файла размером более 2 ГБ с использованием PHP

Но, к сожалению, эти решения не помогли.

1 Ответ

0 голосов
/ 28 августа 2018

Я бы проверил вашу программу просмотра событий 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');
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...