【问题标题】:PHP optimizing use of file_put_contents functionPHP 优化使用 file_put_contents 函数
【发布时间】:2013-03-25 03:18:30
【问题描述】:

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

【问题讨论】:

  • 你试过计时吗?这可能会给你一些指示。
  • 我该怎么做?我已经使用...手表进行了测试。我认为两者都是在同一时间执行的。
  • 你的意思是每次都使用.=吗?还是要在每次循环迭代时重新初始化 $rss
  • 在示例中。 1 有必要在每次迭代时重新初始化 $rss 或使用 $rss = 'text'; (无点)在第一行。我不知道这是否有什么不同。在示例 nr 2 中。我可以使用 .= 每次创建大字符串然后保存它。

标签: php performance io


【解决方案1】:

第一个示例不正确,除非您将 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 条目,并且可以避免在每次迭代中打开和关闭文件。 我还用$rss = ''; 替换了unset,以避免循环内的垃圾收集。

【讨论】:

  • file_fut_contents 与您的解决方案相比非常慢,因此值得更换它(如果有很多函数调用)。
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多