Příručka:Psaní údržbářských skriptů
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
Standardní text
Projdeme si skript údržby helloWorld.php
, který jednoduše vypíše "Hello, World". Tento skript obsahuje minimální množství kódu potřebného ke spuštění a hlavičku s uvedením autorských práv, která by neměla nikdy chybět (viz také hlavičky autorských práv):
Níže uvedený příklad programu vytiskne "Hello, World!":
Jádro MediaWiki
- Command
$ ./maintenance/run HelloWorld Hello, World!
- Filename
maintenance/HelloWorld.php
- Code
<?php require_once __DIR__ . '/Maintenance.php'; /** * Brief oneline description of Hello world. * * @since 1.17 * @ingroup Maintenance */ class HelloWorld extends Maintenance { public function execute() { $this->output( "Hello, World!\n" ); } } $maintClass = HelloWorld::class; require_once RUN_MAINTENANCE_IF_MAIN;
Rozšíření MediaWiki
- Command
$ ./maintenance/run MyExtension:HelloWorld Hello, World!
- Filename
extensions/MyExtension/maintenance/HelloWorld.php
- Code
<?php namespace MediaWiki\Extension\MyExtension\Maintenance; use Maintenance; $IP = getenv( 'MW_INSTALL_PATH' ); if ( $IP === false ) { $IP = __DIR__ . '/../../..'; } require_once "$IP/maintenance/Maintenance.php"; /** * Brief oneline description of Hello world. */ class HelloWorld extends Maintenance { public function __construct() { parent::__construct(); $this->requireExtension( 'Extension' ); } public function execute() { $this->output( "Hello, World!\n" ); } } $maintClass = HelloWorld::class; require_once RUN_MAINTENANCE_IF_MAIN;
Vysvětlení standardního textu
require_once __DIR__ . "/Maintenance.php";
Nejprve vložíme soubor Maintenance.php
. V něm je definována třída class Maintenance
, základ všech údržbářských skriptů, která analyzuje argumenty příkazového řádku, čte vstupní data z konzole, zajišťuje připojení k databázi, atd.
class HelloWorld extends Maintenance {
}
Pak deklarujeme vlastní podtřídu, jako rozšíření třídy Maintenance.
$maintClass = HelloWorld::class;
require_once RUN_MAINTENANCE_IF_MAIN;
A tento kód říká třídě Maintenance, aby v případě, že je zavolána na příkazovém řádku, spouštěla skript přes naši třídu HelloWorld
.
Interně to funguje tak, že RUN_MAINTENANCE_IF_MAIN
natáhne soubor doMaintenance.php a ten zajistí automatické načtení tříd MediaWiki, konfigurace, a následné spuštění naší metody execute()
.
public function execute() {
}
Metoda execute()
je vstupním bodem údržbářkých skriptů. Do ní umístěte hlavní logika vašeho skriptu a vyhněte se volání jakéhokoli kódu z konstruktoru.
Když je náš program spouštěn z příkazového řádku, základní framework údržby se postará o inicializaci jádra MediaWiki a konfigurace atd., a poté tuto metodu vyvolá.
Příkaz nápovědy
Jednou z vestavěných funkcí, kterou mají všechny skripty údržby, je možnost --help
. Výše uvedený vzorový příklad by vytvořil následující stránku nápovědy:
$ php helloWorld.php --help Usage: php helloWorld.php […] 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 --server: The protocol and server name to use in URL --profiler: Profiler output format (usually "text") …
Přidáváme popis
„Na co je ale dobrý tenhle údržbářský skript?” Už slyším, jak se ptáte.
Proto můžeme pomocí metody addDescription
do našeho konstruktoru přidat popis, který se zobrazí hned na začátku výstupu při použití parametru "--help
":
public function __construct() {
parent::__construct();
$this->addDescription( 'Say hello.' );
}
Takže teď už bude vracet náš popis:
$ php helloWorld.php --help Say hello. Usage: php helloWorld.php [--help] …
Volby a zpracování jejich hodnot
Pozdravit celičký svět je nepochybně správné a dobré, ale my chceme, aby ten skript uměl pozdravit i konkrétního jednotlivce.
Abyste přidali další volbu příkazového řádku, přidejte do třídy class HelloWorld
konstruktor, co zavolá ze třídy Maintenance
metodu addOption()
, která zaaktualizuje metodu execute()
, aby zahrnula i vaši novou volbu.
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!" );
}
V tuto chvíli se po spuštění výstup skriptu helloWorld.php
bude měnit, podle toho jakou předáte hodnotu argumentu:
$ php helloWorld.php Hello, World! $ php helloWorld.php --name=Mark Hello, Mark! $ php helloWorld.php --help Say hello. Usage: php helloWorld.php […] … Script specific parameters: --name: Who to say Hello to
Rozšíření
Verze MediaWiki: | ≥ 1.28 Gerrit change 301709 |
Pokud váš údržbářský skript vyžaduje funkce, které nabízí nějaké rozšíření, měli byste přidat také požadavek, aby bylo nejprve tohle rozšíření nainstalováno:
public function __construct() {
parent::__construct();
$this->addOption( 'name', 'Who to say Hello to' );
$this->requireExtension( 'FooBar' );
}
To poskytuje helfpul chybovou zprávu, když rozšíření není povoleno. Například během místního vývoje nemusí být určité rozšíření ještě povoleno v LocalSettings.php nebo při provozování wiki farmy může být rozšíření povoleno na podmnožině wiki.
Uvědomte si, že žádný kód nelze spustit jinak než metodou execute()
.
Pokusy o volání základních služeb, tříd nebo funkcí MediaWiki nebo volání vlastního kódu rozšíření před tím způsobí chyby nebo jsou nespolehlivé a nepodporované (např. mimo deklaraci třídy nebo v konstruktoru).
Profiling
Maintenance scripts support a --profiler
option, which can be used to track code execution during a page action and report back the percentage of total code execution that was spent in any specific function.
See Manual:Profiling .
Psaní testů
Je doporučeno abyste pro vaše údržbářské skripty psali i testy, tak jako u každé jiné třídy. Nápovědu a ukázkové příklady, jak se to dělá najdete na stránce Jak psát testy pro údržbářské skripty.