Příručka:Shell.php

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

shell.php je údržbový skript, který se nachází v adresáři maintenance, který poskytuje REPL shell, který můžete použít k živému hraní s objekty MediaWiki a funkcemi. Je založen na PsySH; nahrazuje eval.php , který je méně robustní a má méně funkcí.

Kromě schopnosti vyhodnocovat příkazy PHP zahrnuje funkce zpracování chyb a fatálních událostí způsobem, který nenaruší shell, zkoumání vnitřních částí objektů, zdrojového kódu a dokumentace prostřednictvím reflexe, integrace externího editoru a další.

Použití

Interaktivně: php maintenance/shell.php
Provádění PHP příkazů ze souboru: cat commands.txt | maintenance/shell.php

Možnosti

Volba Popis
--log-channels Vytiskne protokoly odeslané na dané logové kanály. Oddělené čárkami: --log-channels authentication,cookie,session úrovně protokolu lze filtrovat pomocí --log-channels authentication,cookie:info,session:error
--log-all Tisk protokolů odeslaných do všech kanálů
--dbo-debug Zaznamená více informací souvisejících s databází (přibližně stejné jako nastavení $wgDebugDumpSql )
--no-session Předstírá, že byl nastaven MW_NO_SESSION (užitečné pro ladění kódu, který je vyvolán z koncových bodů bez relace, jako je load.php)

Příklady

Provádění příkazů a zpracování chyb

$ 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

Odraz

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

Výstupní ladění

$ 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"

Integrace editačního řádku

PsySH lze integrovat s readline / editline (PHP je obvykle předpřipraven s druhým).

Ukázka .editrc pro vyhledávání v historii:

# 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

Související odkazy