Manuel:shell.php
Fichier MediaWiki : shell.php | |
---|---|
Emplacement : | maintenance/ |
Code source : | master • 1.42.3 • 1.41.4 • 1.39.10 |
Classes : | MediaWikiShell |
shell.php est un script de maintenance se trouvant dans le répertoire maintenance
; il fournit le shell REPL (read–eval–print loop) que vous pouvez utiliser pour tester en mode réel, les objets MediaWiki ou les fonctions.
Il est basé sur PsySH; il remplace eval.php qui est moins robuste et possède moins de fonctionnalités.
En plus de la possibilité d'évaluer les instructions PHP, la fonctionnalité comprend la gestion des erreurs et des fautes d'une manière qui ne casse pas le shell, en examinant les variables internes des objets, le code source et la documentation par réflexion, l'intégration d'un éditeur externe et davantage encore.
Utilisation
Mode interactif : php maintenance/shell.php
Execution des commandes PHP à partir d'un fichier : cat commands.txt | maintenance/shell.php
Options
Option | Description |
---|---|
--log-channels | Imprime les journaux envoyés à des canaux de trace donnés. Liste est séparée par des virgules : les niveaux de trace de --log-channels authentication,cookie,session peuvent être filtrés avec --log-channels authentication,cookie:info,session:error
|
--log-all | Imprimer les journaux envoyés sur tous les canaux |
--dbo-debug | Journaliser davantage d'informations liées à la base de données (semblable approximativement au paramètre $wgDebugDumpSql )
|
--no-session | Faire croire que MW_NO_SESSION a été déclaré (utile pour déboguer le code qui est appelé d'un point d'accès qui n'a pas de session tel que load.php )
|
Exemples
Exécution des commandes et gestion des erreurs
$ php maintenance/shell.php Psy Shell v0.12.2 (PHP 7.4.33 — cli) by Justin Hileman > MW::user('Admin') = MediaWiki\User\User {#5704 +mId: 1, +mName: "Admin", +mActorId: 1, +mRealName: "", +mEmail: "admin@local.wmftest.net", +mTouched: "20240114073920", +mEmailAuthenticated: "20010101000000", +mFrom: "id", mId: 1, mName: "Admin", mActorId: 1, mRealName: "", mEmail: "admin@local.wmftest.net", mTouched: "20240114073920", mEmailAuthenticated: "20010101000000", mFrom: "id", } > // use $_ for previous return value > $_->mQuickTouched PHP Error: Cannot access protected property User::$mQuickTouched in Psy Shell code on line 2 > sudo $_->mQuickTouched = null > User::newFromIdentity(0) TypeError Argument 1 passed to MediaWiki\User\User::newFromIdentity() must implement interface MediaWiki\User\UserIdentity, int given, called on line 2. > wtf TypeError Argument 1 passed to MediaWiki\User\User::newFromIdentity() must implement interface MediaWiki\User\UserIdentity, int given, called on line 2. -- 0: () at includes/user/User.php:652 1: MediaWiki\User\User::newFromIdentity() at eval()'d code:2 2: eval() at vendor/psy/psysh/src/ExecutionLoopClosure.php:52 Use wtf -a to see 8 more lines
Réflexion
> ls Message Class Constants: FORMAT_BLOCK_PARSE, FORMAT_ESCAPED, FORMAT_PARSE, FORMAT_PLAIN, FORMAT_TEXT Class Methods: __construct, __toString, bitrateParam, bitrateParams, content, durationParam, durationParams, escaped, exists, expiryParam, expiryParams, getFormat, getKey, getKeysToTry, getLanguage, getParams, getTitle, inContentLanguage, inLanguage, isBlank, isDisabled, isMultiKey, listParam, newFallbackSequence, newFromKey, newFromSpecifier, numParam, numParams, params, parse, parseAsBlock, plain, plaintextParam, plaintextParams, rawParam, rawParams, serialize, setContext, setInterfaceMessageFlag, sizeParam, sizeParams, text, timeperiodParam, timeperiodParams, title, toString, unserialize, useDatabase > doc Message::setContext public function setContext(IContextSource $context) Description: Set the language and the title from a context object Param: IContextSource $context Return: Message $this Since: 1.19 >>> show Message::setContext > 724| public function setContext( IContextSource $context ) { 725| $this->inLanguage( $context->getLanguage() ); 726| $this->title( $context->getTitle() ); 727| $this->interface = true; 728| 729| return $this; 730| }
Sortie de débogage
$ php maintenance/shell.php --log-all --dbo-debug [debug] [DBReplication] Wikimedia\Rdbms\LBFactory::getChronologyProtector: using request info { "IPAddress": "", "UserAgent": "", "ChronologyProtection": "true" } [debug] [DBConnection] Wikimedia\Rdbms\LoadBalancer::openConnection: calling initLB() before first connection. [debug] [DBConnection] Connected to database 0 at '127.0.0.1'. [debug] [DBQuery] wiki SHOW /* Wikimedia\Rdbms\DatabaseMysqlBase::serverIsReadOnly */ GLOBAL VARIABLES LIKE 'read_only' [debug] [DBQuery] SHOW GLOBAL VARIABLES LIKE 'read_only' Psy Shell v0.8.5 (PHP 5.6.30-0+deb8u1 — cli) by Justin Hileman >>> MW::message("Recentchanges")->text() [debug] [CryptRand] mcrypt_create_iv generated 20 bytes of randomness. [debug] [CryptRand] 0 bytes of randomness leftover in the buffer. [info] [MessageCache] MessageCache::load: Loading en... local cache is empty, got from global cache => "Recent changes"
Intégration de Editline
PsySH peut s'intégrer avec readline ou editline (PHP est habituellement fourni avec ce dernier).
Un exemple de .editrc
pour la recherche dans l'historique :
# make PgUp/PgDown work, sort of
# editline has no prefix search so use fulltext search
bind "\e[5~" ed-search-prev-history
bind "\e[6~" ed-search-next-history