Vérifier les liens d'un site avec php

Comment vérifier les liens brisés d'un ensemble de pages html, de données json, d'un fichier robots.txt ou d'un sitemap ?

5 avril 2015

Introduction

Nous avons développé une librairie php nommée php-linkchecker.

Cette libraire extrait dans un premier temps, l'ensemble des liens contenus dans les balises html ou dans le texte lui même, elle simule ensuite une connexion sur chaque lien pour en vérifier son existence (Erreur 404,403, ...).

Nous l'utilisons régulièrement afin de vérifier les liens brisés de ce site et de notre projet lyon.glicer.com.

Pré-requis

PHP ou Hypertext Preprocessor doit être installé, php est un langage de programmation libre principalement utilisé dans le développement internet.

Composer est un gestionnaire libre de dépendances pour php, il permet de déclarer et d'installer automatiquement des librairies tierces.

Installation de composer

Exécuter dans un invité, la ligne de commande ci-dessous :

php -r "readfile('https://getcomposer.org/installer');" | php

Cela affiche :

#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: C:\tmp\composer.phar
Use it: php composer.phar

Un fichier composer.phar est maintenant présent dans le répertoire courant.

Configurer le fichier composer.json

Créer un fichier composer.json dans le répertoire courant contenant :

{
    "require": {
       "glicer/link-checker": "dev-master"
    }
}

Installation des librairies

À partir du même répertoire que composer.json, exécuter dans un invité, la ligne de commande ci-dessous :

php composer.phar install

Cela affiche :

Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing symfony/console (v2.3.27)
    Loading from cache

  - Installing symfony/finder (v2.3.27)
    Loading from cache

  - Installing symfony/css-selector (v2.6.6)
    Loading from cache

  - Installing glicer/simply-html (1.0.0)
    Loading from cache

  - Installing react/promise (v2.2.0)
    Loading from cache

  - Installing guzzlehttp/streams (3.0.0)
    Loading from cache

  - Installing guzzlehttp/ringphp (1.0.7)
    Loading from cache

  - Installing guzzlehttp/guzzle (5.2.0)
    Loading from cache

  - Installing glicer/link-checker (dev-master b35cefb)
    Cloning b35cefb3071dae53359c5a12710e18338c9ad6ec

symfony/console suggests installing symfony/event-dispatcher ()
Writing lock file
Generating autoload files

Structure du répertoire

Le répertoire courant contient les fichiers ci-dessous :

composer.json
composer.phar
composer.lock
vendor
 ├───composer
 ├───glicer
 │      ├───link-checker
 │      └───simply-html
 ├───guzzlehttp
 ├───react
 └───symfony

Exemples d'utilisation de la librairie php-linkchecker

Vérifier les liens d'un ensemble de fichiers html

Créer un fichier sample_check_html.php contenant le code ci-dessous :

<?php
require 'vendor/autoload.php';

use GlLinkChecker\GlLinkChecker;
use Symfony\Component\Finder\Finder;

//l'url http://lyon.glicer.com sera utilisée pour transformer les liens relatifs en liens absolus
$linkChecker  = new GlLinkChecker('http://lyon.glicer.com');

//créer un objet finder qui permet d'indiquer les répertoires ou les fichiers à vérifier
$finder = new Finder();

//ajouter l'ensemble des fichiers html et json du répertoire public, ici l'ensemble des fichiers html et json du répertoire public
$files  = $finder->files()->in('./public')->name("*.html")->name("*.json");

//lance la vérification des liens
$result  = $linkChecker->checkFiles(
    $files,
    function ($nbr) {
        // fonction appelée au démarrage
        // $nbr est le nombre de liens à vérifier
    },
    function ($url, $files) {
        // fonction appelée à chaque lien
        // $files est la liste des fichiers qui contiennent cette url
    },
    function () {
        // fonction appelée à la fin
    }
);

//permet d'exporter le résultat au format html
$filereport = GlLinkCheckerReport::toTmpHtml('lyonCheck',$result);

//$filereport contient le chemin vers le rapport
print_r($filereport)

Exécuter le script en tapant la ligne de commande ci-dessous :

php sample_check_html.php

Cela affiche par exemple :

C:\Users\glicer\AppData\Local\Temp\lyonCheck55201c932ada3.html

Ouvrir le fichier html avec un navigateur internet, les liens en erreurs sont affichés en rouge. Survoler un lien avec la souris pour afficher les erreurs rencontrées.

Vérifier les liens du robots.txt et les sitemaps associés

Créer un fichier sample_check_robots.php contenant le code ci-dessous :

<?php
 require 'vendor/autoload.php';

 $linkChecker = new GlLinkChecker('http://lyon.glicer.com');

 //vérifier le robots.txt du site http://lyon.glicer.com
 $result      = $linkChecker->checkRobotsSitemap();

 //afficher le résultat
 print_r($result);

Exécuter le script en tapant la ligne de commande ci-dessous :

php sample_check_robots.php

Cela affiche par exemple :

[
    'disallow' =>
        ['error' => ['/img/', '/download/']],
    'sitemap'  =>
        [
            'ok' => [
                '/sitemap.xml' =>
                    [
                        'ok' =>
                            [
                                '/index.html',
                                '/section/probleme-solution/compresser-css-html-js.html'
                            ]
                    ]
            ]
        ]
];

Dans ce cas /img/ et /download/ n'existent pas.

Versions des logiciels et langages utilisés