Jump to content

Příručka:Kešování souborů

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

MediaWiki umožňuje zvolit k ukládání vykreslených HTML stránek článků do mezipaměti zjednodušené schéma.

Provoz a použití

Souborová mezipaměť slouží pouze anonymním uživatelům a ti vidí vykreslený stejný HTML kód. Přihlášení uživatelé z této mezipaměti nemají žádný prospěch, protože jejich stránka obsahuje uživatelské jméno, vybraný skin atd.

Mezipaměť souborů se povolí nastavením proměnných $wgUseFileCache a $wgFileCacheDirectory v LocalSettings.php:

$wgUseFileCache = true; // výchozí: false
$wgFileCacheDirectory = "$IP/images/cache"; // výchozí: "{$wgUploadDirectory}/cache", což se rovná "$IP/images/cache"

To způsobí, že vykreslená webová stránka HTML pro každou stránku wiki bude uložena v samostatném souboru na pevném disku. Jakékoli následné požadavky od anonymních uživatelů nejsou splněny opětovným vykreslením stránky, ale pouhým odesláním uložené verze HTML, která je na disku. To šetří čas.

Vygenerovaný webový HTML text je uložen na disku v adresářích pod $wgFileCacheDirectory a vypadá přibližně takto:

-rw-r--r-- 1 apache apache 57421 Jan  7 01:58 cache/0/04/P%C3%A1gina_principal.html
-rw-r--r-- 1 apache apache 29608 Jan  4 16:37 cache/1/17/P%C3%A1gina_Riscada.html
-rw-r--r-- 1 apache apache 21592 Jan  3 07:27 cache/1/1c/P%C3%A1gina_Duplicada.html
-rw-r--r-- 1 apache apache 36088 Jan  7 02:03 cache/2/24/P%C3%A1gina_principal_alternativa.html
-rw-r--r-- 1 apache apache 44205 Jan  7 06:10 cache/a/a4/P%C3%A1gina_linkada.html
-rw-r--r-- 1 apache apache 24686 Jan  3 07:27 cache/d/db/P%C3%A1gina_Invertida.html
-rw-r--r-- 1 apache apache 17222 Jan  3 06:28 cache/f/f0/P%C3%A1gina_n%C3%A3o_encontrada.html

V tomto příkladu je adresář mezipaměti souborů cache/ a uložené stránky wiki se nazývají Página ..., což pro každou z nich představuje jeden odpovídající soubor Página_....html. Tyto soubory budou vytvářeny, jakmile uživatelé navštíví články na wiki. Můžete je všechny vytvořit najednou pomocí rebuildFileCache.php skriptu pro údržbu.

Souborová mezipaměť má tendenci ukládat do mezipaměti agresivně. Pro stránky uložené v mezipaměti není stanoveno žádné datum vypršení platnosti a stránky se ukládají do mezipaměti bezpodmínečně, i když obsahují proměnné, rozšíření a další proměnlivý výstup. Některá rozšíření mezipaměť souborů pro stránky s dynamickým obsahem deaktivují.

Pro mnohem efektivnější výsledky zvažte použití $wgUseGzip místo toho nebo v kombinaci.

Pro větší weby je vhodnější použít externí mezipaměť, jako je Squid nebo Varnish, než povolit mezipaměť souborů.

Pokud se zdá, že mezipaměť souborů nefunguje, ujistěte se, že webový server má oprávnění k zápisu do zvoleného adresáře.

Omezení

Názvy souborů mezipaměti jsou určeny odpovídajícími názvy stránek. V závislosti na jazyce použitém v názvech stránek bude nutné některé znaky v názvech souborů zakódovat, aby se vytvořil platný název souboru pro daný souborový systém. U jazyků jako arabština, čínština atd. to může vést k následujícímu varování PHP:

PHP Warning:  file_put_contents(cache/......html.gz): failed to open stream: File name too long in includes/cache/FileCacheBase.php on line 171

Toto je známé omezení. Podívejte se na stránku T148684.

Stránky s popisem kategorií a obrázků se z mezipaměti souborů neodstraňují. Například přidání nebo odebrání stránky z kategorie neaktualizuje stránku kategorie, takže nepřihlášení uživatelé změny na stránce kategorie neuvidí. Toto je známé omezení. Podívejte se na stránku T26575

Doména a rozsah

Ukládání do mezipaměti se provádí pouze pro uživatele, kteří:

  • nejsou přihlášeni.
  • nemají aktivní příznak user_newtalk.

Ukládání do mezipaměti se provádí pouze pro stránky, které:

  • nejsou speciální stránky.
  • nejsou přesměrování.
  • jsou zobrazeny v aktuální verzi, prosté zobrazení, bez parametrů URL.

Toto pokrývá většinu požadavků na wiki, ale stále je důležité nastavit bajtkód a ukládání aplikací do mezipaměti pro zvládnutí zbytku.

Ověření

V každém zobrazení je čas úpravy souboru v mezipaměti porovnán s globálním časovým razítkem $wgCacheEpoch nastaveným v LocalSettings.php .

Pokud je soubor alespoň stejně nový jako oba tyto soubory, je považován za platný a je odeslán přímo klientovi. Pokud je starší nebo neexistuje, parsování a vykreslování pokračuje a výsledky jsou uloženy pro budoucí použití.

Zrušení platnosti

Celou mezipaměť lze zneplatnit nastavením $wgCacheEpoch na aktuální čas nebo smazáním všech souborů v mezipaměti.

Jednotlivé stránky jsou zneplatněny aktualizací jejich polí page.page_touched, což se provádí pohodlně voláním funkce Title::invalidateCache(). Toto by se mělo provádět při vytváření článků, ukládání úprav, přejmenování a vytváření a mazání propojených článků (aby se aktualizovaly odkazy na úpravy). Operace zneplatnění, ke kterým dochází při úpravě šablon, například kontrolují stránky, které používají šablonu, k porovnání data mezipaměti s datem page_touched.

Některé případy ještě nejsou řádně vyřešeny, což pravděpodobně zahrnuje:

  • 'znovu načíst' nebo 'obnovit' prohlížeče (pouze znovu načte stejnou stránku z mezipaměti bez aktualizací)
  • výstupní proměnné z některých rozšíření deaktivují ukládání souborů do mezipaměti pro tyto stránky, aby se zabránilo ukládání zastaralých dat. Ty, které to neudělají, vrátí zastaralá data i po obnovení prohlížeče.
  • některé dlouhé chybové zprávy mohou být ukládány do mezipaměti na dobu neurčitou, jako by se jednalo o platný obsah stránky. Pouze příkaz ?action=purge je po uložení odstraní z mezipaměti souborů. Používá se minimální prahová hodnota velikosti výstupu, aby se zabránilo ukládání většiny chyb do mezipaměti, jako jsou fatální chyby PHP.

Viz také: Příručka:$wgInvalidateCacheOnLocalSettingsChange .

Expirace

Pravděpodobně by měla existovat nějaká metoda pro expiraci stránek mezipaměti, zejména u stránek obsahujících proměnné (je to datum X, máme X článků atd.).

Pokud je $parserOutput->getCacheTime() nastaveno na -1, ukládání souborů do mezipaměti bude pro výstup stránky zakázáno. Neexistuje žádné ustanovení o nastavení doby platnosti, takže veškerý HTML kód pro všechny stránky je navždy uložen v mezipaměti. Explicitní příkaz ?action=purge (nebo úprava stránky) tuto stránku regeneruje, ale ani interní příznaky no-cache v MediaWiki, ani aktualizace prohlížeče neodstraní zastaralý výstup rozšíření, jakmile je uložen jako součást stránky uložené v souboru v mezipaměti.

Obnovení karty

Je možné přidat tabulátor, který vynutí zneplatnění a obnovení jedné jednotlivé stránky pomocí příkazu ?action=purge s použitím rozšíření pro vyčištění stránky.

Komprese

Volitelně může být mezipaměť komprimována, aby se ušetřilo místo a šířka pásma. (To vyžaduje, aby byl zlib povolen v nastavení PHP.)

$wgUseGzip = true;

Pokud je povolena komprese, soubory mezipaměti se ukládají jako .html.gz. Prohlížeče, které v poli Accept-Encoding inzerují podporu pro gzip, obdrží rovnou gzipovanou verzi. Těm prohlížečům, které ji nepodporují, data rozbalíme za chodu a odešleme jim prostý text.

Bude odeslána hlavička $user agent, která proxy cache informuje o tom, aby si dávaly větší pozor na to, komu odesílají data. (Vhodnější by bylo "Vary: Accept-encoding", ale Internet Explorer odmítá ukládat takto označené stránky do mezipaměti.)

Varování Varování: Nepovolujte $wgUseGzip , pokud máte povoleno ukládání do vyrovnávací paměti, která gzipuje obsah (pomocí ob_gzhandler nebo zlib.output_compression). Pokud to uděláte, uživatelům se zobrazí nesmyslný text.

Nouzová záložní služba

Pokud se wiki nemůže spojit s databázovým serverem, pokusí se zobrazit verzi požadované stránky z mezipaměti, bez ohledu na to, zda je aktuální, s přidanou zprávou "database is down".

Toto má určitá omezení:

  • Speciální stránky nejsou nijak pokryty, zobrazuje se pouze varovná zpráva
  • Přesměrované stránky se neukládají do mezipaměti, takže kliknutí na odkaz na přesměrování nevede k cílovému umístění
  • Stránky s dvojtečkami v názvu (jiné než pro platný jmenný prostor) mohou stále selhat, protože MediaWiki kontroluje databázi, zda má název platný interwiki prefix. K tomu dochází pouze v případě, že pro prefix stránky neexistuje žádný záznam v interwiki cache (viz $wgInterwikiExpiry ) nebo pokud $wgMainCacheType používá záložní (nebo nastavenou) hodnotu DB_CACHE.
  • Pokusy o použití akcí, které neurčují zobrazení, vedou k zobrazení prostého webu, což může být matoucí.
  • Mohou se vyskytnout problémy s časovým limitem připojení MySQL, kvůli kterému trvá ukončení neúměrně dlouho, zejména pokud se používají trvalá připojení a databáze později zanikne. Upravte mysql.connect_timeout (nastavte na 3 nebo více) v php.ini, aby se s tím vypořádal. Upravte php.ini webového serveru, nikoli cli php.ini.


Přímé zobrazování stránek z mezipaměti

Ve výchozím nastavení MediaWiki předává stránku mezipaměti pomocí PHP. Zde je návod, jak pomocí konfiguračních triků webového serveru zobrazovat soubory z mezipaměti přímo bez nutnosti volání MediaWiki nebo PHP.

Nejprve nastavte $wgFileCacheDepth = 0;. Poté přidáme pravidla přepisu. Viz níže.

Apache

Následující pravidlo mod_rewrite funguje v souboru .htaccess na sdíleném webhostingu s Apache 2.2:

RewriteBase /
# If a cached page exists under /w/html_cache, do an internal redirect to it:
RewriteCond %{HTTP_COOKIE} !UserID=
RewriteCond %{QUERY_STRING} !.
RewriteCond %{DOCUMENT_ROOT}/w/html_cache/$1.html -s
RewriteRule ^wiki/(.+)$ /w/html_cache/$1.html [B,L,NS]

Toto pravidlo přepisu však nebude správně fungovat pro stránky, jejichž názvy obsahují interpunkci nebo jiné znaky než ASCII. Úhledným řešením by bylo použití RewriteMap, ale to není v kontextu .htaccess podporováno. Místo toho lze pro zpracování názvů, které nejsou v kódu ASCII, použít následující trik, a to přímo z řádku požadavku načtením názvu s escapovaným URL:

RewriteBase /
# If a cached page exists under /w/html_cache, do an internal redirect to it: 
RewriteCond %{HTTP_COOKIE} !UserID=
RewriteCond %{QUERY_STRING} !.
ReWriteCond %{THE_REQUEST} ^GET\x20/wiki/([^\x20/]+)\x20HTTP
RewriteCond %{DOCUMENT_ROOT}/w/html_cache/%1.html -s
RewriteRule ^wiki/(.+)$ /w/html_cache/%1.html [B,L,NS]

The previous rewrite rules will handle requests of the form

https://site/wiki/Page_Name

To handle requests where the Page_Name is in the QUERY_STRING like

https://site/w/index.php?title=Page_Name

the following works:

RewriteCond %{HTTP_COOKIE} !UserID=
RewriteCond %{QUERY_STRING} ^title=([^&]+)$
RewriteCond %{DOCUMENT_ROOT}/images/cache/ns0\%3A%1.html -s
RewriteRule ^ /images/cache/ns0\%253A%1.html? [B,L,NS]

Toto stále nebude odpovídat názvům obsahujícím tečky, lomítka nebo jinou interpunkci, kterou mezipaměť souborů ignoruje, ale prohlížeče ne (nebo naopak). Je také třeba zajistit, aby byla odeslána příslušná hlavička Vary:

Header append Vary Cookie

Také si všimněte, že jelikož tento trik s přesměrováním zcela obchází MediaWiki, nebude respektovat $wgCacheEpoch . V případě potřeby budete možná muset mezipaměť ručně vymazat nebo znovu vytvořit.

Nginx

Protože konfigurační jazyk nginx je poměrně omezený (například neumožňuje vnořené příkazy if), vyžaduje modul ngx_lua.

Následující conf by měl být integrován do vašeho serverového bloku a předpokládá, že:

  • používáte efektní adresy URL jako example.com/Page;
  • vaše složka mezipaměti se nachází ve složce MediaWiki (výchozí nastavení);
  • V posledním bloku umístění již proxyujete soubory *.php do php-fpm (nebo čehokoli jiného).

A zde jsou omezení:

  • stejně jako u řešení Apache musíte spustit úlohu cron nebo ručně znovu vytvořit soubory mezipaměti, pokud se změní;
  • stránky, jejichž název obsahuje jiné než ASCII znaky, jsou poskytovány prostřednictvím PHP (což by každopádně mělo být pro uživatele transparentní).

Změňte cesty podle potřeby.

 location ~ /cache/(.*) {
     internal;
 }
 
 location / {
     default_type 'text/html';
     rewrite_by_lua '
         local cookie = ngx.req.get_headers()["Cookie"] or ""
         if string.match(cookie, "UserID") then  -- if we are logged in...
             ngx.exec("@rewrite")
         else
             local page = string.sub(ngx.var.request_uri, 2, -1)  -- get the page name without the leading slash
             local filename = page .. ".html"
             local f = io.open("/var/www/w/cache/" .. filename, "r")
             if f ~= nil then  -- if the file exists, close it and serve it directly
                 io.close(f)
                 ngx.header["x-wiki-cache"] = "via nginx"  -- headers to help you debug
                 ngx.exec("/cache/" .. filename)
             else
                 ngx.header["x-wiki-cache"] = "via mediawiki"
                 ngx.exec("@rewrite")
             end
         end
     ';
 }
  
 location @rewrite {
     rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&$2 last;
 }

Správa kódu

Související odkazy