tags:

views:

117

answers:

3

Hello,

I have a page with a post and multiple comments, by using PHP's ob_start() I am able to cache it successfully.

Next to each comment I have a username and its number of current posts and reputation. Now I am keeping the cache of the page with the post all until someone adds a new comment, only then I update the cache file.

Now the problem is that a user's post number and reputation will increase as he posts/comments on other topics, and its post number and reputation will not change on elder posts.

What would be the best practice to tackle this issue.

+3  A: 

I sort of hope to be proven wrong, but I don't think there's currently any easy way around this other than limiting the duration of the cache.

You could of course update the relevant reputations, etc. via AJAX but it's quite possible that the connections & bandwidth that this consumes would ultimately outweigh the benefit of caching the page in the first place.

If one of the main goals of caching is to reduce processing overhead (as opposed to bandwidth consumption) you could of course simply flatten out the non-dynamic parts of the page (each post as a static text file or similar - hence reducing the need to re-generate the HTML if you're using Markdown or BBCode, etc.) and include these as required/update them if they're edited.

middaparka
I was maybe thinking of caching a user's profile as a separate page and then just include each user's page for that post. But I am not sure that would be a good way.
Adnan
+3  A: 

If you are by any means concerned with your site's performance you should switch to APC as it provides both opcode caching as well as means for caching as a key/value store.

You can store entire blocks of content, arrays, objects, you name it:

// you must supply:
// 1. a key you will later use to retrieve your content
// 2. the data you wish to cache
// 3. how long the cache should remain valid 
apc_store($key, $data, $ttl);

As far as retrieval goes, you simply make a call like:

$data = apc_fetch($key);
cballou
Do you have experience with handling large data with APC, where the cache would remain store for months? My idea was to store it all until some change happens to it. is it ok?
Adnan
+1  A: 

Some of my thoughts:

You could choose to keep the post pages cached for a certain period of time, like one hour or 15 minutes. This time is depending on the amount of visitors you get on the page, the frequency the details change and your personal preference. Because it does not really matter whether the number of posts of an user is slightly outdated. After this period remove the cached version (also saves resources) and if the page is visited again, it will be re-cached with the updated details.

By clever (re-)using ob_start() you can buffer multiple parts of the page, like the post part and the comments part. Store these parts separately and you only need to regenerate one part instead of the complete page. Most of the times, the post part is not changing very often.

Keep track of the pages where a certain user posted comments (or the page itself, if he created it). Upon changes in the user details (new post/comment added), make these pages obsolete (ie remove the cached version). If you have a lot of changes in a small period of time you could use some background process to re-cache the pages and keep your web-server responsive.

Insert tokens (unique pieces of text, like %user:123,postcount%) of frequent changing details is another possibility. Then store this version into your cache and upon a page request you can replace the tokens with their details. This could also be combined with other caching techniques if the number of page views per period of time is very high (or at least much higher then the frequency of the detail changes).

Veger
thank you for your answer, I am already considering on using tokes.
Adnan