Jump to content
MediaWiki

Manual:shell.php

From mediawiki.org
MediaWiki file: shell.php
Location: maintenance/
Source code: master1.44.21.43.51.39.15
Classes: MediaWikiShell

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

[edit ]

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

Options

[edit ]
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

[edit ]

Command execution and error handling

[edit ]
$ 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

[edit ]
> 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

[edit ]
$ 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

[edit ]

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

[edit ]

AltStyle によって変換されたページ (->オリジナル) /