PHP优化使用file_put_contents函数

时间:2013-04-03 12:42:59

标签: php performance io

我正在查询数据库,然后使用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操作比内存操作慢,所以第一种方式更好。唯一的问题可能是内存限制。

1 个答案:

答案 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 = '';以避免循环内的垃圾收集。