2012-10-05 62 views
1

下面的代碼是否有可能的內存泄漏?我們有一個運行在PHP v5.3.3的Apache服務器上的網站,這個代碼被批評爲可能有內存泄漏。希望看到另外一組眼睛會幫助發現問題。這個XML代碼有沒有可能的PHP內存泄漏?

<?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++; 
} 
?> 

回答

2

「這段代碼被批評爲可能出現內存泄漏」

誰是做批評?如果它是一個IDE,那麼它可能沒有認識到所有的數據收集都是在一個循環的環境中完成的,這個循環會在4次迭代後停止收集數據。

也可能會擔心沒有「其他」的事實 - 即,如果i> 4,它會一直循環直到遍歷整個文件。它不會繼續積累數據,但它會繼續循環。如果文件足夠大,可能會導致問題。

但是,如果將「else {break;}」添加到「if」的末尾,會導致錯誤消失。

0

有一個關於這個代碼的每itaration小內存使用:

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

(RHEL5/PHP 5.1.6)

但這種預期。我沒有發現使用這個代碼使用unset沒有任何好處,但是你總是可以將代碼封裝在一個函數中以獲取所有未設置的代碼。

只是測試,檢驗和測試用memory_get_usage()