我有一个foreach循环,它恰好执行了100多万次提交,并执行了一些测试和数据库查询。问题是,当我跟踪内存使用情况时,它一直以大约500Ko的速度增长,超过了128M的内存最大大小,我在变量上使用了unset,但这不起作用,我注意不要更改最大内存使用大小。有什么办法解决这个问题吗?顺便说一句,我在Windows7上使用XAMPP 3.2.1。
更新以使用生成器
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