Příručka:Psaní údržbářských skriptů

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

Tato příručka krok za krokem popisuje, jak psát údržbářské skripty, které se spouštějí na straně serveru na příkazovém řádku. Jsou založené na třídě Maintenance (viz Maintenance.php ), která je implementovaná od MediaWiki verze 1.16

Ukázkový skript

Projdeme si skript údržby helloWorld.php, který jednoduše vypíše "Hello, World". Tento program obsahuje minimální množství kódu potřebného ke spuštění a také očekávanou hlavičku autorských práv (alternativní hlavičky viz hlavičky autorských práv):

<?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;

Program pouze vytiskne "Hello, World!", ale již má --help (a další možnosti příkazového řádku). Ukázkový výstup:

$ 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 dependent 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.

$

Přehled:

require_once __DIR__ . "/Maintenance.php";
Zahrnuje Maintenance.php. Toto definuje abstract class Maintenance, který má metodu pro analýzu argumentů, čtení konzole, získání databáze atd. Nejlepší je použít úplnou cestu k Maintenance.php.
class HelloWorld extends Maintenance {
Rozšiříme třídu Maintenance a poté s
$maintClass = HelloWorld::class;

require_once RUN_MAINTENANCE_IF_MAIN;
sdělte třídě Maintenance, aby spustila skript pomocí naší třídy HelloWorld, pouze pokud je spouštěn z příkazového řádku. Interně, RUN_MAINTENANCE_IF_MAIN načte další soubor doMaintenance.php, který automaticky načte třídy MediaWiki a konfiguraci, a pak
	public function execute() {
: Funkce execute(), kterou jsme definovali, se provede a náš skript provede svou práci.

Přidáváme popis

"Ale k čemu je tento skript údržby?" Slyším, jak se ptáš.

Můžeme umístit popis na začátek výstupu "--help" pomocí metody addDescription v našem konstruktoru:

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

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

Výstup nám nyní poskytuje popis:

$ php helloWorld.php --help

Say hello.

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

Volby a zpracování jejich hodnot

Pozdravit svět je správné a dobré, ale chceme být schopni pozdravit i jednotlivce.

Chcete-li přidat volbu příkazového řádku, přidejte do class HelloWorld konstruktor, který volá addOption() Maintenance a aktualizujte metodu execute(), aby používala novou možnost. Parametry addOption() jsou $name, $description, $required = false, $withArg = false, $shortName = false, takže:

	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!" );
	}

Tentokrát se po spuštění změní výstup skriptu helloWorld.php v závislosti na poskytnutém argumentu:

$ 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

Rozšíření

MediaWiki version:
1.28
Gerrit change 301709

Pokud je váš skript údržby pro rozšíření, měli byste přidat požadavek, aby bylo rozšíření nainstalováno:

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

Většinou to poskytuje pěkné chybové hlášení, když rozšíření není na dané wiki povoleno (pravděpodobně na wiki farmách). To bude fungovat pouze pro rozšíření, která používají extension.json .

Uvědomte si, že třídy definované vaším rozšířením nebudou dostupné, dokud nenarazíte na funkci execute(). Pokusy o vytvoření instancí dříve, např. v konstruktoru, způsobí, že třída nenalezne výjimky.

Psaní testů

Doporučuje se psát testy pro vaše skripty údržby, jako u jakékoli jiné třídy. Nápovědu a příklady naleznete v příručce Skripty údržby.