Příručka:Jak řešit chyby

This page is a translated version of the page Manual:How to debug and the translation is 100% complete.

Tato stránka obsahuje základní informace potřebné k řešení chyb MediaWiki.

Jednou z prvních věcí, které si všimnete, je, že "echo" obecně nefunguje. Což je součást obecného designu.

K ladění existuje několik možností konfigurace. Ve výchozím nastavení jsou všechny nastaveny na false. Povolte je v LocalSettings.php nastavením na true:

  • $wgShowExceptionDetails Povolení zobrazení dalších podrobností (jako je trasování zásobníku) na stránce "Závažná chyba" (fatal error).
  • $wgDebugToolbar Zobrazení na stránce panel nástrojů s profilováním, protokolovacími zprávami a dalšími.
  • $wgShowDebug Přidá na stránku část "zprávy protokolu" wgDebugToolbar jako nezpracovaný seznam.
  • $wgDevelopmentWarnings Vyvolá upozornění na možné chyby MediaWiki a na zastaralé funkce.

Příklad řádku, který má být přidán do vašeho LocalSettings.php :

$wgShowExceptionDetails = true;

Chyby PHP

Chcete-li zobrazit chyby PHP, přidejte toto do druhého řádku se shora (vpravo pod <?php) do LocalSettings.php :

error_reporting( -1 );
ini_set( 'display_errors', 1 );

Nebo zadejte do php.ini :

error_reporting = E_ALL
display_errors = On

Nebo zadejte do .htaccess:

php_value error_reporting -1
php_flag display_errors On

Chyby PHP e budou zobrazovat na stránce. Tato úprava může útočníkům usnadnit nalezení cesty na váš server. Proto pokud problém najdete, znovu vypněte "echo".

Nezapomeňte, že k fatálním chybám PHP může dojít dříve, než budou výše uvedené řádky provedeny, neboť mohou zabránit jejich zobrazení. Závažné chyby PHP se obvykle zaznamenávají do protokolu chyb Apache - zkontrolujte nastavení error_log v php.ini (nebo použijte phpinfo()).

Zapnutí display_startup_errors

Někteří poskytovatelé vypnou display_startup_errors, což chyby skryje, i když zvýšíte úroveň error_reporting. Zapnutí v rámci programu je příliš pozdě! Místo toho budete muset kolem souboru vytvořit obalový soubor. V případě MediaWiki stačí přidat toto nad mediawiki/index.php:

--- index.php
    error_reporting( -1 );
    ini_set( 'display_startup_errors', 1 );
    ini_set( 'display_errors', 1 );

V jiných prostředích:

--- myTestFile.php
    error_reporting( -1 );
    ini_set( 'display_startup_errors', 1 );
    ini_set( 'display_errors', 1 );
    require 'your_file.php';

SQL chyby

Chcete-li protokolovat všechny dotazy SQL, nikoli pouze ten, který vyvolal výjimku, nastavte $wgDebugDumpSql v LocalSettings.php:

$wgDebugDumpSql = true;
Verze MediaWiki:
1.16 – 1.31

Před verzí MediaWiki 1.32 musíte nastavit $wgShowSQLErrors a $wgShowDBErrorBacktrace, abyste viděli podrobnosti o výjimkách databáze ve výstupu HTML:

$wgShowSQLErrors = true;
$wgShowDBErrorBacktrace = true;

Hloubkové ladění

Debugger

Svůj kód můžete ladit krok za krokem pomocí XDebug . Některá běžná nastavení najdete na stránce:

MediaWiki-Vagrant má k tomu vestavěná nastavení. Pokud nepoužíváte MediaWiki-Vagrant, ale vaše nastavení je podobné, můžete tyto hodnoty znovu použít. V některých případech (např. kvůli firewallu) možná budete muset použít IDE na stejném počítači jako webový server. V tomto případě můžete jednoduše nastavit:

xdebug.remote_enable = 1
xdebug.remote_host = 'localhost'

Další informace naleznete v dokumentaci XDebug.

K ladění skriptu příkazového řádku (např. PHPUnit nebo skriptu údržby) na MediaWiki-Vagrant použijte:

xdebug_on; php /vagrant/mediawiki/path/to/script.php --wiki=wiki ; xdebug_off

Upravte skript, parametry a vzdáleného hostitele (měla by to být IP počítače, kde je vaše IP, 10.0.2.2 by měla podle potřeby fungovat pro MediaWiki-Vagrant).

Protokolování

Pro mnohem podrobnější informace je třeba se profilovat a zaznamenávat chyby.

Pokyny níže platí pouze pro výchozí konfiguraci. Pokud změníte $wgMWLoggerDefaultSpi , například povolíte roli psr3 v vagrant boxu, budou tato nastavení pravděpodobně ignorována. Podívejte se v tomto případě do dokumentace k vašemu loggeru, například na stránku Manual:MonologSpi .

Nastavení souboru protokolu ladění

Chcete-li uložit chyby a informace o ladění do protokolu, přidejte soubor $wgDebugLogFile do souboru LocalSettings.php. Změňte hodnotu na textový soubor, do kterého chcete uložit výstup trasování ladění.

Software MediaWiki musí mít oprávnění od vašeho operačního systému k vytvoření a zápisu do tohoto souboru, například ve výchozí instalaci Ubuntu běží jako uživatel a skupina www-data:www-data. Zde je ukázkové nastavení:

/**
 * The debug log file must never be publicly accessible because it contains private data.
 * But ensure that the directory is writeable by the PHP script running within your Web server.
 * The filename is with the database name of the wiki.
 */
$wgDebugLogFile = "/var/log/mediawiki/debug-{$wgDBname}.log";

Tento soubor bude obsahovat mnoho ladících informací z jádra a rozšíření MediaWiki. Některé subsystémy zapisují do vlastních protokolů. Informace o zachycení jejich výstupu naleznete v části #Vytvoření vlastního souboru protokolu.


  Varování: Soubor protokolu ladění může obsahovat soukromé informace, jako jsou přihlašovací údaje, soubory cookies relací a hodnoty odeslaných formulářů. Pokud jsou tyto informace veřejně přístupné, mohou je útočníci použít k hackování a ohrožení vašeho počítače a uživatelského účtu. Pokud potřebujete sdílet diagnostické protokoly ladění, otevřete wiki bez přihlášení a odeberte z protokolu ladění všechny řádky COOKIE a nezachyťte žádný pokus o přihlášení.

Vytvoření vlastního souboru protokolu

Verze MediaWiki:
1.31

U starších verzí před MediaWiki 1.32 použijte funkci wfErrorLog() k vytvoření vlastního souboru protokolu, který obsahuje pouze vaše konkrétní ladicí příkazy. Tato funkce používá dva argumenty, textový řetězec k protokolování a cestu k souboru protokolu:

wfErrorLog( "An error occurred.\n", '/var/log/mediawiki/my-custom-debug.log' );

Vytváření vlastních skupin protokolů

Pokud ladíte několik různých součástí najednou, může být užitečné nasměrovat určité skupiny protokolů k zápisu do samostatného souboru. Další informace naleznete na stránce $wgDebugLogGroups .

Chcete-li nastavit vlastní skupiny protokolů, použijte v LocalSettings.php následující:

/**
 * The debug log file should not be publicly accessible if it is used, as it
 * may contain private data. However, it must be in a directory to which PHP run
 * within your web server can write.
 *
 * Contrary to wgDebugLogFile, it is not necessary to include a wiki-id in these log file names
 * if you have multiple wikis. These log entries are prefixed with sufficient information to
 * identify the relevant wiki (web server hostname and wiki-id).
 */

// Groups from MediaWiki core
$wgDBerrorLog = '/var/log/mediawiki/dberror.log';
$wgDebugLogGroups = array(
	'exception' => '/var/log/mediawiki/exception.log',
	'resourceloader' => '/var/log/mediawiki/resourceloader.log',
	'ratelimit' => '/var/log/mediawiki/ratelimit.log',

	// Extra log groups from your extension
	#'myextension' => '/var/log/mediawiki/myextension.log',
	#'somegroup' => '/var/log/mediawiki/somegroup.log',
);

Chcete-li se přihlásit k jedné z těchto skupin, volejte wfDebugLog takto:

if ( $module->hasFailed ) {
    wfDebugLog( 'myextension', "Something is not right, module {$module->name} failed." );
}
Pokud jste pečlivě dodržovali výše uvedené pokyny, ale do vašich protokolovacích souborů se nic nezapíše, a pokud váš systém používá SELinux, podívejte se do části protokolování na stránce SELinux a obraťte se na tento problém SELinux v kontextovém dotazu.
Zápis souborů protokolu do adresáře /tmp nemusí vygenerovat vůbec žádný soubor protokolu, i když se předpokládá, že do adresáře /tmp může zapisovat kdokoli. K tomu by mohlo dojít, pokud váš systém používá jednu z funkcí systemd, které pro tento proces vytvářejí virtuální /tmp adresář. Pokud tomu tak je, nakonfigurujte svůj soubor protokolu tak, aby byl zapsán do jiného adresáře, například /var/log/mediawiki.

Strukturované protokolování

Verze MediaWiki:
1.25

Strukturované protokolování umožňuje zahrnout do záznamu protokolu pole. Další informace získáte na stránce Structured logging .

Budete muset nakonfigurovat lepší záznamník, aby shromažďoval další pole. Například Monolog.

Protokolování chyb JavaScriptu

Verze MediaWiki:
1.36

Podívejte se na dokumentaci modulu mediawiki.errorLogger ResourceLoader.

Statistiky

Pokročilé protokolování na straně klienta lze provádět při použití Rozšíření:EventLogging . Což vyžaduje komplexní nastavení a pečlivou kontrolu problémů s ochranou osobních údajů.

Jednoduché počítání určitých druhů událostí je možné (od MediaWiki 1.25) pomocí StatsD. StatsD nabízí měřiče, měřidla, čítače a metriky časování.

Příklad použití:

$stats = $context->getStats();
$stats->increment( 'resourceloader.cache.hits' );
$stats->timing( 'resourceloader.cache.rtt', $rtt );

Metriky lze odeslat na server StatsD, který lze určit pomocí konfigurační proměnné wgStatsdServer. (Pokud není nastaveno, metriky budou zahozeny.) Se StatsD můžete pracovat lokálně (aniž byste potřebovali Graphite server) spuštěním serveru StatsD a jeho konfigurací s backendem "backends/console", který bude vydávat metriky do konzole.

Od MediaWiki 1.25 je wfIncrStats() zkratkou metody increment() v hlavní instanci RequestContext::getStats().

Odeslání debug dat do komentáře HTML ve výstupu

To může být někdy užitečné při podpoře netechnického koncového uživatele. Je to bezpečnější než vystavení souboru protokolu ladění webu. Protože výstup obsahuje pouze soukromá data pro aktuálního uživatele. Není to však ideální pro vývojové použití, protože se ztratí data o závažných chybách a přesměrováních. Použití ve vývoji se nedoporučuje. Ladící komentáře odhalují informace v zobrazeních stránek, které by mohla potenciálně vystavit bezpečnostním rizikům.

$wgDebugComments = true;

Práce živě s objekty MediaWiki

eval.php je interaktivní skript pro vyhodnocení a interakci s objekty a funkcemi MediaWiki v plně inicializovaném prostředí.

 $ php maintenance/eval.php
 > print wfMessage("Recentchanges")->plain();
 Recent changes

Virtuální počítač MediaWiki-Vagrant integruje interaktivní prostředí PHP phpsh (při použití Zendu).

Volitelné aktualizace

Kód vložený do funkce DeferredUpdates::addCallableUpdate(), jako je například $rc->save() v RecentChange.php, není proveden během webového požadavku. Takže pokud se nezdaří, nebude zobrazena žádná chybová zpráva. Pro ladění může být užitečné dočasně odebrat kód z funkce, aby byl spuštěn živě.

Interaktivní shell

shell.php můžete použít jako PHP REPL s plným přístupem k interním informacím MediaWiki.

Ladění na straně klienta (JavaScript)

Wikipedie nabízí bohatou sadu nástrojů pro ladění JavaScriptu na straně klienta. Kromě nástrojů MediaWiki jsou k dispozici další techniky, které pomáhají diagnostikovat interakce klienta.

Nástroje:

  • ResourceLoader nabízí prostředek k zajištění JavaScriptu, který lze snadno zobrazit pomocí nástrojů na straně klienta.
  • Otevřete konzolu prohlížeče. Mnoho skriptů Mediawiki na straně klienta zaznamenává chybové zprávy do konzole pomocí ResourceLoaderu, který poskytuje bezpečně orientovaný způsob pro přihlášení do klientské konzole. Kromě funkce protokolování nativního JavaScriptu poskytuje kontrolu, zda je k dispozici konzola a že protokolování nevyvolává svou vlastní chybu. Režim ladění architektury zavaděče zdrojů také popisuje tuto funkci.
  • Nástroje prohlížeče mohou poskytovat nativní funkce pro ladění skriptu na straně klienta.
  • Síťové indikátory, například Wireshark, mohou poskytnout nahlédnutí do skriptu, který poskytuje stránka.
  • Ke své adrese URL můžete přidat ?debug=true jako v https://www.mediawiki.org/wiki/MediaWiki?debug=true, abyste získali podrobnější informace pro ladění prostřednictvím konzole prohlížeče

Související odkazy