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 条目存储在内存中,并且可以避免在每次迭代中打开和关闭文件。我还替换了unsetwith$rss = '';以避免循环内的垃圾收集。

于 2013-04-03T12:59:54.767 回答