У меня есть цикл foreach, который выполняет более 1 миллиона изменений и выполняет несколько тестов и запросов к базе данных. Проблема в том, что когда я отслеживаю использование памяти, она продолжает расти примерно с 500Ко, с этой скоростью она превышает максимальный размер памяти 128М, я использовал unset для своих переменных, но это не работает, я стараюсь не менять максимальную память Размер использования.
Есть идеи, как решить эту проблему?
Кстати, я использую XAMPP 3.2.1 на Windows 7.
Обновление для использования генераторов
public function import()
{
$var = 0;
$filename = 'path';
if (file_exists($filename))
{
if (($handle = fopen($filename, "r")) !== FALSE)
{
foreach ($this->readLines($filename) as $data)
{
if (strpos($data[2], 'string') !== false)
{
// codes and DB queries
}
else
{
if (strpos($data[1], '.png') !== false)
{
// code
}
else
{
if ($data[0] != "")
{
switch($var)
{
case 0:
// code
break;
case 1:
// code
break;
case 2:
// code
break;
case 3:
// code
break;
case 4:
// code
break;
case 5:
// code
break;
}
}
else
{
// code
}
}
}
}
fclose($handle);
return //route;
}
{
return //route;
}
}
else
{
return //route;
}
return //route;
}
Мой генератор выглядит так:
function readLines($filename)
{
$file= fopen($filename, 'r');
try
{
while (($line= fgetcsv($file, 1024, ",")) !== FALSE)
{
yield $line;
}
}
finally
{
fclose($file);
}
}
Я наконец нашел решение этой проблемы, и это моя плохая причина, потому что я не читал документацию Laravel.
По умолчанию Laravel хранит журнал в памяти всех запросов, которые были выполнены для текущего запроса. Однако в некоторых случаях, например при вставке большого количества строк, это может привести к тому, что приложение будет использовать избыточную память. Чтобы отключить журнал, вы можете использовать метод disableQueryLog
DB::connection()->disableQueryLog();
Всем спасибо.
Вы должны найти причину утечки памяти. Сбросить ваши переменные PHP. Однажды я просочился в цикл, потому что класс базы данных, который я использовал, хранил все запросы, выполненные в массиве, который увеличивался в размере с каждым запросом
Вы должны взглянуть на генераторы.
http://php.net/manual/de/language.generators.overview.php