0

データベースにクエリを実行し、返されたデータを file_put_contents() で XML ファイルに保存しています。この関数を呼び出す方法はどれが良いのだろうかと思っています。この場合、$data は大きな配列であり、変数 $rss には大きな文字列を含めることができることに注意してください。

最初に、次のようなものを実装しました。

foreach($data as $item)
{
    $rss .= '<title>'.getTitle($item['id']).'</title>';
    $rss .= '<data>'.getData($item['id']).'</data>.';
    file_put_contents($this->fileRss, $rss);
    unset($rss);
}

そして、上記を次のように変更しました。

foreach($data as $item)
{
    $rss .= '<title>'.getTitle($item['id']).'</title>';
    $rss .= '<data>'.getData($item['id']).'</data>.';
}

file_put_contents($this->fileRss, $rss);

どちらの方法が良いですか?非常に大きな変数 $rss を作成して保存するか、毎回非常に小さな変数を保存しますか? よくわかりませんが、IO操作はメモリ操作よりも遅いと思うので、最初の方法が良いです。唯一の問題はメモリ制限かもしれません。

4

1 に答える 1

5

FILE_APPEND を file_put_contents に追加しない限り、最初の例は正しくありません。

file_put_contents($this->fileRss, $rss, FILE_APPEND);

ループの前にファイルを手動で開き、RSS データの各チャンクをループ内に書き込み、ループの後にファイルを閉じます。

$file = fopen($this->fileRss, 'w');
foreach($data as $item)
{
    $rss = '';
    $rss .= '<title>'.getTitle($item['id']).'</title>';
    $rss .= '<data>'.getData($item['id']).'</data>.';
    fwrite($file, $rss);
}
fclose($file);

この方法では、すべての rss エントリをメモリに保存せず、繰り返しごとにファイルを開いたり閉じたりする必要がなくなります。また、ループ内でのガベージ コレクションを回避するためにunsetをに置き換えました。$rss = '';

于 2013-04-03T12:59:54.767 に答える