我有一个处理大型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
对象中,我有一个运行时缓存,它将一些基本选择查询的结果存储在一个数组中,以便以后快速访问。这是脚本中唯一的变量(我知道),它在整个脚本中增加了大小,因此我尝试使用此选项。内存使用率下降,但只是一点点,并且整个脚本中的内存使用量仍在上升。
我的问题如下:
在整个长时间运行的脚本中,内存使用率的缓慢上升是否是PHP中的正常行为,或者我应该搜索整个代码,并尝试找出是什么在吞噬我的内存?
我知道通过在变量上使用unset()
,我可以释放它从内存中占用的空间,但即使我覆盖了内存,我也需要使用unset()
整个文件中的变量相同?
用我的例子略微改述我的第二个问题:
以下两个代码块是否产生与内存使用相同的结果,如果没有,哪一个更优化?
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);
答案 0 :(得分:0)
如果在开发机器上安装xdebug模块,可以让它执行功能跟踪 - 这将显示每行的内存使用情况 - https://xdebug.org/docs/execution_trace
这可能会帮助您确定空间的位置 - 然后您可以尝试取消设置($ var)等,看看它是否有任何区别。