我正在查询数据库,然后使用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操作比内存操作慢,所以第一种方式更好。唯一的问题可能是内存限制。
答案 0 :(得分: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 = '';
以避免循环内的垃圾收集。