Information relative à l'utilisation des données personnelles

Le site pajagus.fr utilise des cookies pour analyser le trafic sur le site.

Seules les données nécessaires à l'agent Google Analytics sont enregistrées. Ces informations sont utilisées pour générer des rapports de connexions, sessions, pages vues, provenance des visiteurs...

Aucune autre information n'est enregistrée par le site pajaguse.fr.

En utilisant ce site vous acceptez l'utilisation de ces cookies.

Générer des pages statiques et un sitemap.xml avec PHP

PHP LogoLa plupart des sites Internet utilisent un CMS (WordPress ou autre) et/ou un framework PHP, Java.. pour générer des pages Internet dynamiquement.

Ainsi le contenu dynamique est toujours à jour, les pages sont créées à chaque accés. Il existe des système de caches mais souvent les configurations sont complexes et posent pas mal de problèmes lors des mises à jours.

Le tout dynamique pose le problème des performances. Générer les pages à chaque accès nécessite beaucoup de puissance CPU (surtout si le site est très fréquenté) et donc cela peut au final ralentir le site de manière globale. Cela est d’autant plus important que maintenant Google tiens compte du temps de chargement des pages pour classer les sites.

Un autre point imporntant c’est que quelque soit le CMS que vous utilisez il y a régulièrement des failles qui sont découvertes et corrigées. Mais cela nécessite de tenir à jour son serveur et de rester très vigilant à chaque nouvelle alerte de sécurité.

La solution idéale serait que le site soit entièrement statique. La vitesse d’affichage serait exceptionnelle, vous ne seriez plus vulnérables aux attaques relatives aux failles des CMS, le site étant uniquement constitué de pages HTML statiques. En contre partie les mises à jour seraient plus ‘compliquées’ car il faudrait éditer un fichier HTML, tout le monde ne parle pas HTML :).

Entre ces deux cas de figure une solution est à envisager : Générer des pages statiques à partir d’un site dynamique. Seules les pages statiques seraient accessibles au public. Le site dynamique serait utilisé uniquement pour les mise à jour. On a ainsi les avantages des deux solutions.

Voila l’idée de base du script que je vais vous présenter aujourd’hui.


Fonctionnement du script

C’est un script PHP pour générer des pages HTML statiques à partir d’une liste d’url du site dynamique. Le script génère également un fichier sitemap.xml avec la liste de toutes les ulrs des pages créées.

Le script ne traite pas les ressources externes utilisées par les différentes pages du site (fichiers CSS, JS et images). Pour que tout fonctionne correctement il faudra que ces ressources soit accessibles depuis les pages statiques.

Par exemple si vous utilisez une image dans :   static/gfx/image.jpg  cette image doit être accessible depuis le dossier ou seront créées les pages statiques.

Le plus simple c’est de regoruper toutes ces resssources dans un seul dossier et de créer un lien symbolique entre le dossier source et le dossier dest. Dans l’exemple ci-dessus, le site dynamique est dans prod/monsite et les pages statiques dans dev/monsite. Pour que le dossier static soit accessible daux pages statiques :

cd /var/www/prod/monsite
ln -s /var/www/dev/monsite/static static

Seules la partie après le nom de domaine est a prendre en compte,  la partie nom de domaine https://…/ est traitée automatiquement par le script.

Partie 1 : les variables

Le script utilise 1 variable ou 3 constantes :

HTTPIN

  • Adresse HTTP source des urls à traiter
  • Exemple : https://dev.monserveur.com/site1/

HTTPOUT

  • Adresse HTTP de sortie pour les urls des pages générées
  • Exemple : http://www.monsite.fr/

OUTDIR

  • Dossier ou seront enregistré les pages HTML
  • Par défaut c’est le dossier d’exécution du script ‘./’

$URLS

  • Liste des pages à traiter sous forme de SRC=>DEST
  • Exemple : « presentation/ »=> »presentation.html »

On notera plusieurs choses :

  • Il est possible de ré-écrire la base HTTP si   HTTPIN != HTTPOUT
  • Il est possible de ré-écrire les ulrs si  SRC!=DEST (dans le tableau URLS)
  • Le / de fin doit être indiqué pour HTTPIN et HTTPOUT

Le ré-écritures sont également effectuées dans le code HTML de toutes les pages.

On peut partir de l’url  http://dev/page1  (URL Worpdress)  et créer une page : http://monsite.com/presentation.html

Toute les occcurences de page1 dans les pages HTML traitées seront remplacées par presentation.html. Ainsi les liens internes ne seront pas cassés.

Partie 2 : Lecture des pages

Pour chaque url  (page) une boucle lit le contenu HTML et l’enregistre dans une variable $content. Si une erreur
d’accès survient le script s’arrête. L’URL de la page lue correspond à :  HTTPIN + PAGESRC (dans $URLS)

foreach($URLS as $urlIn=>$pageOut) {
  $fullURL = HTTPIN.$urlIN;
  $f = @fopen($fullURL,'r');
  $ok = false;
  $content='';
  if (!$f) {
    echo "Erreur ouverture url $fullURL', traitement annulé\n\r";
    exit;
  }
  while (!feof($f)) {
   $content .= fread($f, 8192); // lecture par paquets de 8192 chr
  }
  fclose($f);
  ....
}

Partie 3 : Ré-écriture des urls dans les pages

Pour chaque page lue, le code HTML est analysé et une ré-écriture des urls est effectuée
si nécessaire. On remplace  HTTPIN par HTTPOUT et page SRC par page DEST ($URLS).

$content = str_replace(HTTPIN,HTTPOUT,$content);
foreach($URLS as $in=>$out) {
if($in!=$out) {
  $content = str_replace($in,$out,$content);
}

Partie 4 : Ecriture du fichier HTML static

Une fois le code HTML traité, le script l’enregistre dans le dossier OUTDIR chaque page avec le nom définit en DEST dans le tableau $URLS. Si une erreur intervient le script s’arrête.

$fichier = OUTDIR.$pageOUT;
$out = fopen($fichier,'w');
if( !$out) {
  echo "Erreur écriture fichier $fichier, traitement annulé\r\n";
  exit;
}
echo "Ecriture page $pageOUT\n\r";
fputs($out,$content);
fclose($out);

Partie 5 : Création du sitemap.xml

Pour chaque page  HTML enregistrée, une section est ajoutée au sitemap.xml

$tmp = str_replace('{URL}', HTTPOUT.$pageOUT, $block);
$xml .= str_replace('{DATE_MODIF}',date('Y-m-d'),$tmp);

Une fois toutes les pages traitées, le fichier sitemap.xml est enregistré dans le dossier OUTDIR.

$sitemap = fopen('sitemap.xml','w');
if(!$sitemap) {
  echo "Erreur ouverture sitemap.xml, script arrêté \r\n";
  exit;
}
$xml .= "</urlset>"; 
fputs($sitemap,$xml);
fclose($sitemap);

Partie 6 : Exécution du script

Le script est exécutable en console avec : php make-static.php.
Mais vu que c’est un script PHP il est également possible de l’exécuter via une url : https://…/make-static.php

Il est également possible d’automatiser le process avec une tache planifiée qui exécute le script à interval régulier.

Une fois le script exécuté, dans le dossier OUTDIR se trouveront toutes les pages HTML statiques générées et le fichier sitemap.xml.

NB: le script ne supprime pas les anciens fichiers. Si des pages sont supprimées dans $URLS, les fichiers statiques correspondants resterons dans le dossier OUTDIR, il faudra les supprimer manuellement.

Partie 7 : Code commenté du script make-static.php

<?php
// racine pour toutes les urls en lecture
define('HTTPIN',"https://dev.monsite.com/demo/");

// racine pour les urls des pages en sortie (utilisé dans le sitemap.xml)
define('HTTPOUT','https://www.monsite.fr/');

// dossier de sortie pour les pages html
define('OUTDIR','./');

/*
 tableau des urls a scanner SRC=>DEST
 pour chaque SRC HTTPBASE sera ajouté pour lire la page
 pour chaque DEST HTTPOUT sera ajouté dans sitemap.xml
 */
$URLS = array(
  // SRC=>DEST
  ''=>'index.html',  // page home du site
  'category1'=>'pc-portble.html',  // remapping d'url type wordpress
  'category2'=>'ecrans.html",
  'category3'=>'imprimantes.html'
);

/* NE RIEN MODIFIE APRES CETTE LIGNE */

// block XML pour chaque PAGE/URL
$block = " <url>
 <loc>{URL}</loc>
 <lastmod>{DATE_MODIF}</lastmod>
 <changefreq>monthly</changefreq>
 <priority>0.8</priority>
 </url>\n";

// entete XML sitemap.xml
$xml='<?xml version="1.0" encoding="UTF-8"?>'."\n".'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";

foreach( $URLS as $urlIN=>$pageOUT) {
  $fullURL = HTTPIN.$urlIN;
  $f = @fopen($fullURL,'r');
  $ok = false;
  $content='';
  if (!$f) {
    echo "Erreur ouverture url $fullURL', traitement annulé\n\r";
    exit;
  }
  while (!feof($f)) {
    $content .= fread($f, 8192); // lecture par paquets de 8192 chr
  }
  fclose($f);

  // remplace les urls absolue qui contiendrai HTTPIN par HTTPOUT
  $content = str_replace(HTTPIN,HTTPOUT,$content);

  // remplace les noms de pages si différent entre urlIN et pageOUT

  foreach($URLS as $in=>$out) {
    if($in!=$out) {
      $content = str_replace($in,$out,$content);
    }
  }
  // ecriture du fichier static html
  $fichier = OUTDIR.$pageOUT;
  $out = fopen($fichier,'w');
  if( !$out) {
    echo "Erreur écriture fichier $fichier, traitement annulé\r\n";
    exit;
  }
  echo "Ecriture page $pageOUT\n\r";
  fputs($out,$content);
  fclose($out);

  // ajout url dans sitemap.xml
  $tmp = str_replace('{URL}', HTTPOUT.$pageOUT, $block);
  $xml .= str_replace('{DATE_MODIF}',date('Y-m-d'),$tmp);
} // foreach

// creation sitemap.xml
$sitemap = fopen('sitemap.xml','w'); // ouverture fichier sitemap.xml
if(!$sitemap) {
  echo "Erreur ouverture sitemap.xml, script arrêté \r\n";
  exit;
}
$xml .= "</urlset>"; // cloture fichier XML
fputs($sitemap,$xml); // entete
fclose($sitemap);

Partie 8 : pistes pour améliorer le script

Stocker les variables (HTTPIN, HTTPOUT, OUTIDR et $URLS) dans un fichier ini pour ne pas avoir à editer le script.

 

Pas de Commentaire

Qu'en pensez-vous ?

Votre formulaire contient des erreurs, merci de corriger.