PHP优化使用file_put_contents函数

web*_*.pl 0 php io performance

我正在查询数据库,然后使用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);
}
Run Code Online (Sandbox Code Playgroud)

然后我改为:

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

file_put_contents($this->fileRss, $rss);
Run Code Online (Sandbox Code Playgroud)

哪种方式更好?制作一个大的,大的变量$ rss,然后保存它或每次保存很小的变量?我不确定,但我认为IO操作比内存操作慢,所以第一种方式更好.唯一的问题可能是内存限制.

SWi*_*ilk 5

第一个示例不正确,除非您将fILE_APPEND添加到file_put_contents.

file_put_contents($this->fileRss, $rss, FILE_APPEND);
Run Code Online (Sandbox Code Playgroud)

我宁愿在循环之前手动打开文件,在循环中写入每个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);
Run Code Online (Sandbox Code Playgroud)

这样您就不会将所有rss条目存储在内存中,并且避免在每次迭代中打开和关闭文件.我也替换了unsetwith $rss = '';以避免循环内的垃圾收集.