Manuel:Écriture des scripts de maintenance

This page is a translated version of the page Manual:Writing maintenance scripts and the translation is 100% complete.

Ceci est un tutoriel pas à pas sur la manière d'écrire un script de maintenance basé sur la classe Maintenance (voir Maintenance.php ) introduite dans la version 1.16 de MediaWiki pour rendre plus simple l'écriture des lignes de commande des scripts de maintenance MediaWiki.

Exemple de script

Nous avons décrit un script de maintenance helloWorld.php qui ne fait qu'afficher « Hello, World! ». Ce programme contient le minimum de code nécessaire à son lancement ainsi que les en-têtes requises pour les droits d'auteur (pour l'utilisation d'autres en-têtes, voir En-têtes de droit d'auteur):

<?php

/**
 * To the extent possible under law,  I, Mark Hershberger, have waived all copyright and
 * related or neighboring rights to Hello World. This work is published from the
 * United States.
 *
 * @copyright CC0 http://creativecommons.org/publicdomain/zero/1.0/
 * @author Mark A. Hershberger <mah@everybody.org>
 * @ingroup Maintenance
 */

require_once __DIR__ . '/Maintenance.php';

class HelloWorld extends Maintenance {
	public function execute() {
		$this->output( "Hello, World!" );
	}
}

$maintClass = HelloWorld::class;

require_once RUN_MAINTENANCE_IF_MAIN;

Le programme imprimera simplement « Hello, World! » mais aura déja une option --help (et d'autres options de ligne de commande). Une sortie possible :

$ php helloWorld.php
Hello, World!
$ php helloWorld.php --help

Usage: php helloWorld.php [--conf|--dbgroupdefault|--dbpass|--dbuser|--globals|--help|--memory-limit|--mwdebug|--profiler|--quiet|--server|--wiki]

Generic maintenance parameters:
    --help (-h): Display this help message
    --quiet (-q): Whether to suppress non-error output
    --conf: Location of LocalSettings.php, if not default
    --wiki: For specifying the wiki ID
    --globals: Output globals at the end of processing for debugging
    --memory-limit: Set a specific memory limit for the script, "max"
        for no limit or "default" to avoid changing it
    --server: The protocol and server name to use in URLs, e.g.
        https://en.wikipedia.org. This is sometimes necessary because server name
        detection may fail in command line scripts.
    --profiler: Profiler output format (usually "text")
    --mwdebug: Enable built-in MediaWiki development settings

Script dependant parameters:
    --dbuser: The DB user to use for this script
    --dbpass: The password to use for this script
    --dbgroupdefault: The default DB group to use.

$

Aperçu :

require_once __DIR__ . "/Maintenance.php";
Nous incluons Maintenance.php. Cela définit la classe abstraite Maintenance qui contient les méthodes pour analyser syntaxiquement les arguments, lire la console, interroger la base de données, etc. Il est conseillé d'utiliser le chemin complet vers Maintenance.php.
class HelloWorld extends Maintenance {
Nous étendons la classe Maintenance, puis avec
$maintClass = HelloWorld::class;

require_once RUN_MAINTENANCE_IF_MAIN;
nous demandons à la classe Maintenance d'exécuter le script en utilisant notre classe HelloWorld, seulement si l'exécution a lieu à partir de la ligne de commande. En interne, RUN_MAINTENANCE_IF_MAIN charge un autre fichier doMaintenance.php qui charge automatiquement les classes et les paramètres de MediaWiki, puis
	public function execute() {
La fonction execute() que nous avons fournie est exécutée et notre script réalise son travail.

Ajouter une description

« Mais quel est le but de ce script de maintenance ? » Je vous entends déjà le demander.

Il est possible de mettre une description au début de la sortie du « --help » en utilisant la méthode addDescription dans notre constructeur :

	public function __construct() {
		parent::__construct();

		$this->addDescription( 'Say hello.' );
	}

Maintenant la sortie nous donne la description :

$ php helloWorld.php --help

Say hello.

Usage: php helloWorld.php [--conf|--dbgroupdefault|--dbpass|--dbuser|--globals|--help|--memory-limit|--mwdebug|--profiler|--quiet|--server|--wiki]
…

Analyse des options et des arguments

Saluer le monde est très sympathique et très bien, mais nous voulons être capable de saluer également des individus.

Pour ajouter une option, ajoutez un constructeur à la classe HelloWorld qui appelle addOption() de Maintenance et qui met à jour la méthode execute() pour utiliser la nouvelle option. Les paramètres de addOption() sont $name, $description, $required = false, $withArg = false, $shortName = false, donc :

	public function __construct() {
		parent::__construct();

		$this->addDescription( 'Say hello.' );
		$this->addOption( 'name', 'Who to say Hello to', false, true );
	}

	public function execute() {
		$name = $this->getOption( 'name', 'World' );
		$this->output( "Hello, $name!" );
	}

Cette fois, à l'exécution, la sortie du script helloWorld.php change en fonction des arguments fournis :

$ php helloWorld.php
Hello, World!
$ php helloWorld.php --name=Mark
Hello, Mark!
$ php helloWorld.php --help

Say hello.

Usage: php helloWorld.php [--conf|--dbgroupdefault|--dbpass|--dbuser|--globals|--help|--memory-limit|--mwdebug|--name|--profiler|--quiet|--server|--wiki]
…
Script specific parameters:
    --name: Who to say Hello to

Extensions

Version de MediaWiki :
1.28
Gerrit change 301709

Si votre script de maintenance concerne une extension, alors vous devez ajouter la condition, que celle-ci soit installée :

	public function __construct() {
		parent::__construct();
		$this->requireExtension( 'FooBar' );
		$this->addOption( 'name', 'Who to say Hello to', false, true );
	}

En général cela fournit un joli message d'erreur lorsque l'extension n'est pas active sur le wiki (tout comme pour les fermes de wikis). Ceci ne fonctionne que pour les extensions qui utilisent extension.json .

Notez-bien que les classes définies par votre extension ne seront pas disponibles tant que vous n'aurez pas atteint la fonction execute. Toute tentative pour créer des instances AVANT ceci, par exemple dans le constructeur, génèrera des exceptions du type classe non trouvée.

Ecrire des tests

Il est recommandé d'écrire des tests pour vos scripts de maintenance, comme pour toute autre classe. Voir le guide des scripts de maintenance pour l'aide et les exemples.