2016-05-14 40 views
0

我有一个处理大型XML文件的php脚本,并将它们的数据保存到数据库中。在保存到数据库之前,我使用几个类来处理并将数据存储在PHP脚本中,并逐个节点读入XML以保留内存。 Basicaly,在我的文件中的循环是这样的:这是正常的记忆行为?

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 secs Parsed 87 @ 23.053930997849 secs |(mem_usage:3102360 | ETA:2626.8231951916 secs Parsed 98 @ 26.148546934128 secs |(mem_usage:3285096 | ETA:2642.0705279769 sec s Parsed 107 @ 29.092607021332 secs | (mem_usage:3431944 | ETA:2689.8426286172秒

现在,我知道肯定,在我的MySQL对象,我有一个运行时的缓存,它保存了一些基本选择查询的结果在一个数组,以便快速访问后来,这是脚本中唯一的变量(我知道的),它在整个脚本中的大小都增加了,所以我试着转动这个选项,内存使用量下降了,但只有一点点,但仍然是。在整个脚本上升

我的问题有以下几点:

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

  2. 我知道,通过对一个变量使用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); 
+1

Block1和Block2将具有相同的内存使用率,但由于未设置和重新创建$ var –

+2

,因此可能会导致block2的运行速度变慢,因为可能会在整个长时间运行的脚本中缓慢增加内存使用量,但会导致内存缓慢上升在一个循环内使用一个长时间运行的脚本'是很少见的,除非这个循环正在构建一个数组或类似的东西......它看起来像你的循环内部的东西正在消耗内存并且不会释放它 –

+0

嗯,这正是我所关心的。在这种情况下,我需要逐个调试,循环使用的每个函数:| –

回答

0

如果安装在开发机器上的XDebug的模块,你可以得到它做一个函数轨迹 - 这将显示内存每条线的用法 - https://xdebug.org/docs/execution_trace

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