I'm querying the database and then storing returned data to XML file with file_put_contents(). I'm wondering which way of invoking this function is better. Note that $data is large array and variable $rss can contain a big string in this case.
At first I implemented something like this:
foreach($data as $item)
{
$rss .= '<title>'.getTitle($item['id']).'</title>';
$rss .= '<data>'.getData($item['id']).'</data>.';
file_put_contents($this->fileRss, $rss);
unset($rss);
}
And then I changed above to:
foreach($data as $item)
{
$rss .= '<title>'.getTitle($item['id']).'</title>';
$rss .= '<data>'.getData($item['id']).'</data>.';
}
file_put_contents($this->fileRss, $rss);
Which way is better? Making a big, big variable $rss and then saving it or saving quite small variable every time? I'm not sure but I think IO operations are slower than memory operations so first way is better. Only problem may be memory limit.
The first example is incorrect, unless you add FILE_APPEND to file_put_contents.
file_put_contents($this->fileRss, $rss, FILE_APPEND);
I would rather manually open the file before the loop, write each chunk of rss data inside the loop, and close the file after the loop.
$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);
This way you do not store all the rss entries in memory, and you avoid opening and closing the file in each iteration. I have also replaced the unset
with $rss = '';
to avoid garbage collection inside the loop.