Manuel:shell.php

This page is a translated version of the page Manual:Shell.php and the translation is 100% complete.

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

Voir aussi