Cache genereren voor webpagina's

Cache genereren voor webpagina's

In deze tutorial wordt een manier beschreven om snel met behulp van de XML sitemap website cache te genereren. Het kan lokaal worden uitgevoerd en er zijn dus geen extra scripts op de server of in het CMS nodig.

Bijna alle content management systemen maken gebruik van caching. Eventueel via plug-ins wordt er data opgeslagen (cache) om volgende aanvragen te versnellen. Na het bewerken van een website is het fijn als de website weer snel en optimaal functioneert.
Het is erg vertragend dat bij iedere eerste pagina aanvraag eerst weer nieuwe cache aangemaakt moet worden.

Voorbeelden zijn gemaakt op Linux Ubuntu, maar Nodejs is toepasbaar op diverse systemen (Windows, Mac OSX, Linux)

Gebruik is gemaakt van:
- Ubuntu 14.04.2 LTS.
- XML sitemap (Google)
- nodejs
- npmjs, javascript package manager

Cache genereren

  1. Nodejs installeren
  2. NPM gebruiken
  3. (Google) xml-sitemap als gids
  4. Script om cache aan te maken

1. Nodejs installeren

- Via softwarecentrum

Nodejs kan met Ubuntu direct via het software centrum geïnstalleerd worden.

- Via de commandline

Check of Nodejs al is geïnstalleerd

$ nodejs -v

Als NodeJS al is geïnstalleerd dan verschijnt er een versie nummer, iets als:

v0.10.25

Anders moet het nog geïnstalleerd worden

$ sudo apt-get update
$ sudo apt-get install nodejs

Nogmaals checken of Nodejs goed geïnstalleerd is

$ nodejs -v

2. Npm gebruiken

NPM  is een javascript package manager. Deze maakt het gemakkelijk verschillende modules voor nodejs te installeren

- Via softwarecentrum
npm is via het software centrum te installeren, maar de pakketten die met behulp van npm geïnstalleerd zullen worden moeten wel via de commandline uitgevoerd worden.

- Via commandline

$ sudo apt-get install npm

Nogmaals checken of Nodejs en Npm goed geïnstalleerd zijn

$ npm -v

- xml2js (Simple XML to JavaScript object converter)

xml2js is een pakket dat nodig is voor het parsen van de XML-sitemap.
Eerst zal dit pakket via npm geïnstalleerd moeten worden

$ npm install xml2js

- request (Simplified HTTP request client)

request  is nodig voor het aanroepen van de te  URL's in de sitemap. Door deze requests zullen de desbetreffende pagina's in de cache worden opgeslagen.

$ npm install request

3. sitemap.xml

Veel websites hebben tegenwoordig een XML site map.
Zo niet is het via bepaalde websites of met speciale scipts gemakkelijk er één te maken.
https://code.google.com/p/sitemap-generators/wiki/SitemapGenerators
https://support.google.com/webmasters/answer/183668?hl=nl

Sitemap structuur:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
  <url>
    <loc>http://www.voorbeeldwebsite.nl/home.html</loc> 
  </url>
  <url>
    <loc>http://www.voorbeeldwebsite.nl/foo.html</loc> 
  </url>
</urlset>

Als de sitemap bestaat gaat het nu alleen nog maar om de url, deze hebben we straks nodig.

Sitemap url: http://www.voorbeeldwebsite.nl/sitemap.xml

4. Nodejs script om cache te genereren

Het script parsed de opgegeven sitemap en spreekt één voor één de url's aan die in de sitemap onder het loc-tag staan.

var xml2js = require('xml2js'),
    request = require('request'),
    xmlurl = process.argv[2];


var call = function (url, callback) {

    // HTTP request
    request.get(url)
        .on('response', function (response) {
            if (response.statusCode == 200) {

                callback(response.request.uri.href, response.statusCode);
            }
        });
}

if (xmlurl) {
    // Check sitemap URL
    var matches = xmlurl.match(/^(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?((.*)\.(xml))$/i);
    xmlurl = matches && matches[0];


    if (xmlurl) {
        // sitemap XML
        var xml = '';
        request.get(xmlurl, function (error, response, xml) {
            if (!error && response.statusCode == 200) {

                // Create parser
                var parser = new xml2js.Parser();

                // Parse sitemap XML
                parser.parseString(xml, function (error, result) {
                    if (!error) {

                        var urls = result['urlset']['url'];
                        var url = new Array();

                        for (var key in urls) {
                            call(urls[key]['loc'][0], function (href, statusCode) {
                                // Success 
                                console.log("Cached:\t", href);
                            });
                        }
                    }
                });
            }
            else {
                console.log("[ERROR] Response statuscode: " + response.statusCode);
            }
        });
    }
    else {
        console.log('[ERROR] URL voldoet niet of verwijst niet naar XML sitemap');
    }
}
else {
    console.log('[ERROR] Geen URL gedefineerd');
}

script: cache.js

Voer het script uit op de commandline

$ nodejs cache.js http://www.voorbeeldwebsite.nl/sitemap.xml

Het script kan dus gebruikt worden met alle websites die een XML sitemap hebben.