Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP内存使用率随着每个循环不断增长_Php_Windows_Memory_Xampp_Bigdata - Fatal编程技术网

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

PHP内存使用率随着每个循环不断增长,php,windows,memory,xampp,bigdata,Php,Windows,Memory,Xampp,Bigdata,我有一个foreach循环,它碰巧执行了超过100万次迭代,并执行了一些测试和数据库查询。问题是,当我跟踪内存使用情况时,它以大约500Ko的速度不断增长,超过了128M的内存最大大小,我对变量使用了unset,但这不起作用,我小心不要更改最大内存使用大小。 有没有办法解决这个问题? 顺便说一下,我在Windows7上使用的是XAMPP3.2.1 更新以使用生成器 我的发电机看起来像: function readLines($filename) { $file= fopen($filen

我有一个foreach循环,它碰巧执行了超过100万次迭代,并执行了一些测试和数据库查询。问题是,当我跟踪内存使用情况时,它以大约500Ko的速度不断增长,超过了128M的内存最大大小,我对变量使用了unset,但这不起作用,我小心不要更改最大内存使用大小。 有没有办法解决这个问题? 顺便说一下,我在Windows7上使用的是XAMPP3.2.1

更新以使用生成器

我的发电机看起来像:

function readLines($filename)
{
    $file= fopen($filename, 'r');
    try
    {
        while (($line= fgetcsv($file, 1024, ",")) !== FALSE)
        {
            yield $line;
        }
    }
    finally
    {
        fclose($file);
    }
}

你应该看看发电机。
您必须找到内存泄漏的原因。取消设置php变量。我曾经在一个循环中泄漏,因为我使用的数据库类将所有执行的查询存储在一个数组中,该数组随着每个查询的增大而增大,我最终找到了这个问题的解决方案,这是我的错误,因为我没有阅读Laravel文档

默认情况下,Laravel会在内存中保存针对当前请求运行的所有查询的日志。但是,在某些情况下,例如插入大量行时,这可能会导致应用程序使用过多的内存。要禁用日志,可以使用disableQueryLog方法


谢谢大家。

我们可以猜测您的代码在做什么,在循环的每次迭代中您可能会扩展什么数组,或者您可能会显示一些代码,这样我们就可以告诉您,您现在发布了一些代码,但看起来您已经删除了任何可能使用内存的内容,将其替换为
//code
注意,您正在生成器和主函数代码中打开该文件。。。。您只需要将其打开一次(在生成器中,因为您使用它来实际读取文件),除非您将异常注入到生成器中(但不捕获它们),否则您不需要在生成器中使用try/finally,因为fgetscv()永远不会抛出ExceptionAnk you Mark,我的代码弄乱了我所做的所有更改trynna找出了问题的根源。通过阅读文档,这正是我想要的,谢谢Fox,我会尝试一下,让你知道使用生成器并没有多大帮助,我在读取CSV的循环中使用了它,但内存使用量一直在增加,直到达到允许的128M。我仍在寻找解决方案,我将发布我的函数和生成器。我在所有变量上使用了unset,现在我正在检查数据库查询,顺便说一句,我使用了Laravel的ORM,雄辩
function readLines($filename)
{
    $file= fopen($filename, 'r');
    try
    {
        while (($line= fgetcsv($file, 1024, ",")) !== FALSE)
        {
            yield $line;
        }
    }
    finally
    {
        fclose($file);
    }
}
DB::connection()->disableQueryLog();