Page caching mod for sNews 1.7

Page caching mod for sNews 1.7

Hi again, as promised, I have completed my caching mod for sNews 1.7, and here is my initial release.

What the hell is caching and do I need it?

Well, basically what we're doing with this mod is saving a page's output into a raw HTML document, and we serve that page until there's a change that would require hitting the database again. If your site is like mine and gets a few comments a day and you're adding a few articles a day, then yes, this mod would likely help you considerably.

Uh, what? I need an example please.

Fair enough, say you have an article with 20 comments, every time someone visits that page, you're querying the database for the article, all the comments, as well as anything else on the page (site title, description, categories list, pages, recent comments list, recent articles, my related posts mod, etc). With this mod the first time someone calls the page all information would be pulled from the database and the resulting HTML will be saved into your "cache" folder, and then subsequently served to users after that, up until a new comment is posted, an article is added/edit/deleted, etc.

Sound good? Great, this is another super easy mod to implement, first download the package and unzip.


VERSION history
[1.0.3] - added code to strip failed comments
[1.0.2] - fixed the check for approved comments, should properly empty the cache now
[1.0.1] - added "remember me" function for my sticky forms mod
[1.0.0] - initial release

Now modify the following variables inside the mod.cache.php file. They are self-explanatory, and the comments inside the file should assist you.

$cache_dir = '/home/mysite/cache';
$cache_keep_days = '7';
$cache_polls = '0';

Cool, now upload mod.cache.php to the same directory as your snews.php and index.php files. Create the "cache" directory you specified now as well, if you haven't already.

Now open your index.php file add add the following at the top, just below your snews.php include (and poll include if you have it), like the following;

<?php
include('snews.php'); 
include('mod.cache.php');
//include("mod_poll/poll_functions.php"); //uncomment if you're using my polls mod
startCache();
?>

Now add this to the very bottom of your index.php file;

<?php
outputCache();
?>

Yeah, that's it, upload index.php and browse your site when you're not logged in, you'll see your cache directory start filling up and notice your MySQL database getting only one query per page once cached. Edit an article or post a comment and watch the cache folder empty.

Tags

 

You might like

Comments


Thanks Matt
Added.
PP


uh oh... message was not sent.
Another try:

Hi Matt
Nice job you've done with that Mod.
It works as the files are created but I'm not sure it's gonna work as of on 1and1 shared servers.
I'm receiving a message sayin it's not allowed there. :-D
Gonna see if it can be fixed by a php.ini.


Another mod, i'm gonna try this out later, not that my site get's overrun, but from time to time, snews kinda "burps".


@ Sven, does 1and1 run PHP in safe mode or something?

@ Slemborg, I hear you, my site doesn't really either, but it doesn't really hurt to cache content when no DB connection is really needed.


Oops, I left out the bit to set the "remember me" checkbox to checked or unchecked for my sticky comments mod, that has been updated now, v1.0.1.


I suppose Matt.
They don't give any information.
.cache files are created but can't be read.


That's interesting, what are the cache folder and .cache file permissions?

You can check and see if you're running PHP in safe mode, just create a file called phpinfo.php, put this in it;

<?php
echo phpinfo();
?>

Then upload it and check if safe_mode is Off or On.

BTW, safe_mode is being removed from PHP 6, thankfully.


Made it working by moving the outputCache() call in another place. Don't ask why now it works now. No please. :-D


Sven,

Yes, I'm running it on here no problem.

It looks like the cache isn't being emptied on new comments, do you have comment moderation enabled or do you allow new comments to post immediately?

Did you verify you're not in safe mode?


Yeap safe mode is off and new comments are posted immediatly.


Oh crap, I was checking the wrong setting!

Change

    if (s('mail_on_comments') == 'off') {
        $moderateOff = true;
    }


to

   if (s('approve_comments') != 'on') {
        $moderateOff = true;
   }


I will fix and update package now.


Haha, thanks for being the guinea pig, as always! :)


This modification is great for me. Significantly reduce the burden on the database.
Unfortunately, my site is running statistics (chCounter) and
[MOD] Page view counter for sNews 1.7 only http://snewscms.com/forum/index.php?topic=...
Is there any easy way to update only those data?
For example, everything between
<span class="statV">
and
</span>
will be updated.

I should be grateful for your response.

P.S.
Translation to English: translate.google.pl


Hi toolman,

Yes, it's easy enough to do, provided you have the functions that output the data. If you look at the code inside mod.cache.php, you can see where we strip the dynamic content with a preg_replace, and then update it with the correct content, whether it's the user's IP or the show_poll function.

To do this, you need to uniquely identify the content you're replacing. Say, for example, the page counter, wrap the number in HTML comments, like

<!-- START_COUNTER -->
php function that outputs the counter code
<!-- END_COUNTER -->

then strip it inside mod.cache.php for storage;

$cache = preg_replace('/<!--\sSTART_COUNTER\s-->(.*?)<!--\sEND_COUNTER\s-->/s', '<!--COUNTER-->', $cache);
and finally add the counter back in when the cached page is served;
$cache = preg_replace('/(<!--COUNTER-->)/e', 'counterFunction($variables)', $cache);

Because you're not querying the article database, you'll need to write a separate function to get the counter, as shown with the "counterFunction" I added above.

Does that make sense?


Making a day of it ;) ... Third Matt-Mod now. this one is awsome... continuing for more goodies, hehe.. Thanks, Matty.


Howdy,

damnit once again me :/ sorry Matt, but I dont see nothing :/

<?php
include('snews.php');
include('mod.cache.php');
include("mod_poll/poll_functions.php"); //uncomment if you're using my polls mod
startCache();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


and added the output

<div id="footer">
<p>This site is powered by <a href="#" title="zenEngine" onclick="target='_blank';">zenEngine</a> | <?php login_link(); ?></p>
<?php
outputCache();
?>
</div>


Nothing is displaying...but I see the cashe folder has something inside it :( Whats wrong here :S


Hi Tatsu, Not sure if this will really help, but the outputCache function should be called at the very bottom of your index.php, after all other HTML.


Howdy, Ive putted the code at the end, after the </html>, and yet nothing? Does it even show anything when you are not logging in as admin? xD

Damnit... :D


Tatsu, I just looked at your site real quick and I'm seeing the cache timestamp at the bottom.

Does it only give you a blank page on the first view? What browser are you using?


Im using, Firefox...and no, I dont get a blank page at first use. Really dont know whats wrong?! Do you have a messenger? :D would be faster, but if you have time and if you wish afkors! :D

enj0y matt


I'm about to leave work, shoot me a message through the contact form and I'll email you back later tonight if I get a chance.


Hello. It's me again.
I use a modified "Page view counter for sNews 1.7" (http://snewscms.com/forum/index.php?topic=8089.0)
Unfortunately, I have a problem with the refresh counter.
I added a function StartCache() line:
$cache = str_replace('<!--COUNTER-->', $views, $cache);
and to OutputCache() line:
$cache = preg_replace('/<!--\sCOUNTER_START\s-->(.*?)<!--\sCOUNTER_END\s-->/s', '<!--COUNTER-->', $cache);

Cache file now contains a <!--COUNTER--> , but unfortunately does not display the counter in your browser.
What am I doing wrong?


Toolman,

Looks like there's no spaces in the counter comment, i.e.

  
           
<!-- COUNTER -->


Comments are closed. No new comments allowed.

Copyleft 2002 - 2017 Matt Jones
Hand crafted with HTML5 & CSS3
↑ Back to top