1

以下のコードでメモリリークが発生する可能性はありますか? PHP v5.3.3 を使用する Apache サーバーで Web サイトを実行していますが、このコードはメモリ リークの可能性があると批判されています。これを見て別の目が問題を特定するのに役立つことを望んでいました.

<?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 を使用する利点は見つかりませんでしたが、いつでもコードを関数にラップして、すべてを unset にすることができます。

memory_get_usage() でテスト、テスト、テストするだけです

于 2012-10-05T20:38:17.620 に答える