PHP内存使用量随着每个循环而不断增长


PHP Memory usage keeps growing with each loop

我有一个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