1

下面的代码是否可能存在内存泄漏?我们有一个使用 PHP v5.3.3 在 Apache 服务器上运行的网站,该代码被批评为可能存在内存泄漏。希望另一双眼睛看着这个会帮助发现一个问题。

<?php
// set feed URL
$feedURL = 'http://gdata.youtube.com/feeds/api/users/UFDeptHousing/uploads';

// read feed into SimpleXML object
$sxml = simplexml_load_file($feedURL);
?>
<?php
// iterate over entries in feed
    $i = 0;
foreach ($sxml->entry as $entry) {
        if($i < 4) {
  // get nodes in media: namespace for media information
  $media = $entry->children('http://search.yahoo.com/mrss/');

  // get video player URL
  $attrs = $media->group->player->attributes();
  $watch = $attrs['url']; 

  // get video thumbnail
  $attrs = $media->group->thumbnail[1]->attributes();
  $thumbnail = $attrs['url']; 

  // get <yt:duration> node for video length
  $yt = $media->children('http://gdata.youtube.com/schemas/2007');
  $attrs = $yt->duration->attributes();
  $length = $attrs['seconds']; 

  // get <yt:stats> node for viewer statistics
  $yt = $entry->children('http://gdata.youtube.com/schemas/2007');
  $attrs = $yt->statistics->attributes();
  $viewCount = $attrs['viewCount']; 

  // get <gd:rating> node for video ratings
  $gd = $entry->children('http://schemas.google.com/g/2005'); 
  if ($gd->rating) {
    $attrs = $gd->rating->attributes();
    $rating = $attrs['average']; 
  } else {
    $rating = 0; 
  }


  ?>
  <tr>
    <td width="95">
    <span class="thumbnail"><a href="<?php echo $watch; ?>"><img src="<?php echo $thumbnail;?>" width="85" height="48" alt="<?php 
        $varlength = strlen($media->group->title);
      if ($varlength > 30) {
        echo substr($media->group->title,0,30)."...";
      }else {
          echo $media->group->title;
      }         ?>" /></a></span>
    </td>
    <td width="130">
    <span class="title"><a href="<?php echo $watch; ?>">
            <?php 
        $varlength = strlen($media->group->title);
      if ($varlength > 30) {
        echo substr($media->group->title,0,30)."...";
      }else {
          echo $media->group->title;
      }         ?>
    </a></span>
    <span class="length">Length: <?php printf('%0.2f', $length/60); ?></span>  
    </td>
  </tr>
<?php
        }
        $i++;
}
?>
4

2 回答 2

2

“此代码被批评为可能存在内存泄漏”

谁在批评?如果它是一个 IDE,它可能没有意识到所有数据收集都是在循环的上下文中完成的,该循环将在 4 次迭代后停止收集数据。

它还可能担心没有“else”这一事实——即,如果 i > 4,它只会继续循环,直到它遍历整个文件。它不会继续积累数据,但会继续循环。如果文件足够大,可能会导致问题。

但也许在“if”末尾添加“else {break;}”会使错误消失。

于 2012-10-05T20:46:50.780 回答
0

此代码的每次迭代都有少量内存使用:

Mem: 77920 / 77960
Mem: 83968 / 83968
Mem: 84280 / 84280

(RHEL5/PHP 5.1.6)

但这是意料之中的。我没有发现在这段代码中使用 unset 有任何好处,但是您始终可以将代码包装在一个函数中以取消所有设置。

只需使用 memory_get_usage() 进行测试、测试和测试

于 2012-10-05T20:38:17.620 回答