First of all, your rule was incorrect, use this instead:
'rules' => array(
'/sitemap.xml' => '/site/sitemapxml',
...
)
Now, regarding your question, it doesn't really matter that much, which way you will prefer, each of them has its own cons and pros.
Controller action option
Pros:
- Easy to implement and sustain. It's just another action, you won't forget how sitemap is generated in your system.
Cons:
- Dynamic content, therefore, lower performance.
Solution:
use COutputCache filter for caching. Add this filter to your SiteController:
public function filters()
{
return array(
array(
'COutputCache + sitemap',
'duration' => 24 * 60 * 60 // cache for 24 hours
),
);
}
Don't forget to configure cache
component in your configuration file. Use CFileCache for that. Read the corresponding section of The Definitive Guide to Yii if you're not familiar with this topic.
It's a pretty flexible solution, you can extend this example to make it reading caching duration from your configuration file if needed.
yiic option
Pros:
- sitemap.xml is just a static file, served more efficiently by the web server
Cons:
- need to update it regularly and control this process
- need to use something else except the framework, this requires some monitoring as well
Solution:
use a cron job to generate sitemap.xml
.
Although the final decision highly depends on particular details of the project, generally, I'd stick to the first approach.