Jump to content

Manual:shell.php

From mediawiki.org
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

shell.php is a maintenance script that is located in the maintenance directory that provides a REPL shell you can use to play live with MediaWiki objects and functions. It is based on PsySH; it replaces eval.php which is less robust and has fewer features.

Beyond the ability to evaluate PHP statements, functionality includes handling errors and fatals in a way that does not break the shell, examining object internals, source code and documentation via reflection, external editor integration and more.

Usage

Interactively: php maintenance/run.php shell
Executing PHP commands from a file: cat commands.txt | maintenance/run.php shell

Options

Option Description
--log-channels Print logs sent to the given log channels. Comma-separated: --log-channels authentication,cookie,session Log levels can be filtered with --log-channels authentication,cookie:info,session:error
--log-all Print logs sent to all channels
--dbo-debug Log more database-related information (roughly the same as setting $wgDebugDumpSql )
--no-session Pretend MW_NO_SESSION has been set (useful for debugging code that's invoked from no-session endpoints such as load.php)

Examples

Command execution and error handling

$ php maintenance/run.php shell
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

Reflection

> 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|        }

Debug output

$ php maintenance/run.php shell --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"

Editline integration

PsySH can integrate with readline / editline (PHP usually comes pre-built with the latter).

A sample .editrc for history search:

# 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

See also