There are lots of ways to handle this. One way is to implement pull-based caching, either directly in your application or with a "wrapper" that takes advantage of PHP's ability to open URLs (thus accomplishing pretty much what wget does in Beth's suggestion).
Basically then the logic looks like this:
If the page exists and it is less than a week old, serve it with passthru(); else { query database, build page, save the results, serve it}.
Some commercial content-management systems, notably Vignette, take this approach and implement it at a module level. This takes load off the database and allows some routine processing to be done one time, while preserving the dynamic nature of the top-level presentation (supporting personalization, et cetera).