这是正常的记忆行为吗?

时间:2016-05-14 16:45:19

标签: php memory

我有一个处理大型XML文件的PHP脚本,并将数据从这些文件保存到数据库中。在保存到数据库之前,我使用几个类来处理和存储PHP脚本中的数据,并逐节点地读取XML以保留内存。基本上,我文件中的循环如下所示:

while ($Reader->read()) {
        $parsed++;
        if (time() >= $nexttick) {
            $current=microtime(true)-$ses_start;
            $eta=(($this->NumberOfAds-$parsed)*$current)/$parsed;
            $nexttick=time()+3;
            $mem_usage=memory_get_usage();

            echo "Parsed $parsed @ $current secs \t | ";
            echo " (mem_usage: " . $mem_usage . " \t | ";
            echo "ETA: $eta secs\n";
        }

        $node=$Reader->getNode();
        // OMMITED PART: $node is an array, I make some processing, and check if everything exists in the array that I need in the following section

        $Ad=new Ad($node); // creating an Ad object from the node

        // OMMITED PART: Making some additional SQL queries, to check the integrity of the data, before uploading it to the database


        if (!$Ad->update()) {
            //add wasn't inserted succesfully, saving a row in a second database table, to log this information
        } else {
            //add succesfully inserted, saving a row in a second database table, to log this information
        }
}

您注意到,循环的第一部分是一个小输出工具,每3秒输出一次文件的进度,并输出脚本的内存使用情况。我需要这个,因为我遇到了一个内存问题,上次我试图上传文件,并想弄清楚,什么东西正在吞噬记忆。

当我运行它时,这个脚本的输出看起来像这样:

  

解析15 @ 2.0869598388672秒| (mem_usage:1569552 | ETA:1389.2195994059秒   解析30 @ 5.2812438011169秒| (mem_usage:1903632 | ETA:1755.1333565712秒   解析38 @ 8.4330480098724秒| (mem_usage:2077744 | ETA:2210.7901124829秒   解析49 @ 11.377414941788秒| (mem_usage:2428624 | ETA:2310.5440017496秒   解析59 @ 14.204828023911秒| (mem_usage:2649136 | ETA:2393.3931421304秒   解析69 @ 17.032008886337秒| (mem_usage:2831408 | ETA:2451.3750760901秒   解析79 @ 20.359696865082秒| (mem_usage:2968656 | ETA:2556.8171214997秒   解析87 @ 23.053930997849秒| (mem_usage:3102360 | ETA:2626.8231951916秒   解析98 @ 26.148546934128秒| (mem_usage:3285096 | ETA:2642.0705279769秒   解析107 @ 29.092607021332秒| (mem_usage:3431944 | ETA:2689.8426286172 secs

现在,我确切地知道,在我的MySQL对象中,我有一个运行时缓存,它将一些基本选择查询的结果存储在一个数组中,以便以后快速访问。这是脚本中唯一的变量(我知道),它在整个脚本中增加了大小,因此我尝试使用此选项。内存使用率下降,但只是一点点,并且整个脚本中的内存使用量仍在上升。

我的问题如下:

  1. 在整个长时间运行的脚本中,内存使用率的缓慢上升是否是PHP中的正常行为,或者我应该搜索整个代码,并尝试找出是什么在吞噬我的内存?

  2. 我知道通过在变量上使用unset(),我可以释放它从内存中占用的空间,但即使我覆盖了内存,我也需要使用unset()整个文件中的变量相同?

  3. 用我的例子略微改述我的第二个问题:

    以下两个代码块是否产生与内存使用相同的结果,如果没有,哪一个更优化?

    BLOCK1

     $var = str_repeat("Hello", 4242);
     $var = str_repeat("Good bye", 4242);
    

    BLOCK2

     $var = str_repeat("Hello", 4242);
     unset($var);
     $var = str_repeat("Good bye", 4242);
    

1 个答案:

答案 0 :(得分:0)

如果在开发机器上安装xdebug模块,可以让它执行功能跟踪 - 这将显示每行的内存使用情况 - https://xdebug.org/docs/execution_trace

这可能会帮助您确定空间的位置 - 然后您可以尝试取消设置($ var)等,看看它是否有任何区别。