DokuWiki

Je lepší, když je to jednoduché

Nástroje uživatele

Nástroje webu


tips:maintenance

Údržba

https://www.dokuwiki.org/tips:maintenance

Zde je několik tipů, jak automatizovat každodenní údržbu, která je pro DokuWiki potřebná nebo doporučená.

Viz také pluginy: cleanup a clearhistory

Udržujte blacklist aktuální

Viz blacklist pro nastavení cronjobu, který udržuje Anti-Spam Blacklist aktuální.

Automatický skript pro úklid

Pro vytížené DokuWiki instalace se doporučuje nastavit proces pravidelného úklidu. Následující skript shellu Bash (Unix shell) slouží jako příklad. Maže staré revize ze složky Starší verze (revize), odstraňuje neplatné zámky a prázdné adresáře a čistí cache1).

cleanup.sh
#!/bin/bash
 
cleanup()
{
    local data_path="$1"        # full path to data directory of wiki
    local retention_days="$2"   # number of days after which old files are to be removed
 
    # purge files older than ${retention_days} days from attic and media_attic (old revisions)
    find "${data_path}"/{media_,}attic/ -type f -not -name _dummy -mtime +"${retention_days}" -delete
 
    # remove stale lock files (files which are 1-2 days old)
    find "${data_path}"/locks/ -name '*.lock' -type f -mtime +1 -delete
 
    # remove empty directories
    find "${data_path}"/{attic,cache,index,locks,media,media_attic,media_meta,meta,pages,tmp}/ \
        -mindepth 1 -type d -empty -delete
 
    # remove files older than ${retention_days} days from the cache
    if test -n "$(find "${data_path}"/cache/?/ -maxdepth 1 -print -quit &> /dev/null)"
    then
        find "${data_path}"/cache/?/ -type f -not -name _dummy -mtime +"${retention_days}" -delete
    fi
}
 
 
# cleanup DokuWiki installations (path to datadir, number of days)
# some examples:
 
cleanup /home/user1/htdocs/doku/data    256
cleanup /home/user2/htdocs/mywiki/data  180
cleanup /var/www/superwiki/data         180

Pro automatické spuštění nastavte cronjob. Následující příklad spouští skript každý den 7 minut po půlnoci. Pro spuštění jako běžný uživatel odstraňte root.

7 0 * * *   root  /full/path/to/cleanup.sh

Ujistěte se, že je vše správně nastaveno – nechcete přece omylem smazat nesprávné soubory, že?

Windows – waRmZip

Skript pro čištění starých souborů na systémech Windows je waRmZip, dostupný na SourceForge. Napište dávkový soubor, který jej spustí, a naplánujte jeho denní běh. Jak se říká: „Ujistěte se, že je vše správně nastaveno“ ;-)

Použil jsem výše uvedený návrh s waRmZip a napsal tento dávkový soubor – možná vám pomůže.

Můj oblíbený způsob spouštění cronjobů na Windows je PyCron.

dw-cleanup.bat
@echo off
set waRmZip="c:\Program Files\waRmZip\waRmZip.wsf"
set wikiHome="c:\path\to\htdocs\wiki\data"

rem Move attic files older than 30 days to an archive location
%waRmZip% %wikiHome%\attic /ma:30 /md:%wikiHome%_archive\attic /r /q

rem Option: delete attic files older than 30 days
rem %waRmZip% %wikiHome%\attic /da:30 /dc /r /q

rem Delete empty attic directories; waRmZip requires the /da flag when using
rem /df, so add filter for *.zzz so /da doesn't remove any files
%waRmZip% %wikiHome%\attic /r /da:31 /df /fo:*.zzz /q

rem Remove stale lock files
%waRmZip% %wikiHome%\locks /da:1 /fo:*.lock /r /q

rem Remove empty directories
%waRmZip% %wikiHome%\pages /da:365 /df /fo:*.zzz /r /q

Windows – dávkový skript

Toto je další skript pro příkazový řádek Windows pro údržbu vaší DokuWiki instalace v prostředí Windows. Skript využívá bezplatný open-source nástroj find, který lze získat přes http://gnuwin32.sourceforge.net/

Všechny cesty jsou načteny z konfiguračního souboru DokuWiki. Soubory určené ke smazání lze předem zobrazit, aby se předešlo nechtěnému odstranění.

maintain_dokuwiki.cmd
@echo off
setlocal

REM This script performs some basic DokuWiki maintenance

REM Copyright (C) 2012 Peter Mosmans

REM This program is free software: you can redistribute it and/or modify
REM it under the terms of the GNU General Public License as published by
REM the Free Software Foundation, either version 3 of the License, or
REM (at your option) any later version.

REM This program is distributed in the hope that it will be useful,
REM but WITHOUT ANY WARRANTY; without even the implied warranty of
REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
REM GNU General Public License for more details.

REM You should have received a copy of the GNU General Public License
REM along with this program. If not, see <http://www.gnu.org/licenses/>.

REM Please contact support AT go-forward.net for questions and/or feedback

 
REM Last modification: 02-05-2012 (Peter Mosmans)
set NAME=maintain_dokuwiki
set VERSION=0.13

REM path to the dokuwiki configuration file enclosed in double quotes
set DOKUWIKICONFIG="\full\filename\of\your\dokuwiki\conf\local.php"
REM preserve all files that are younger than DAYSTOKEEP days
set DAYSTOKEEP=31
REM set to true if you want to show results and pause before deleting any files
set SHOWRESULTSFIRST=true
set FIND=c:\tools\find.exe
set TEMPFILE=%TMP%\%NAME%.tmp

REM see if all tools are present
for %%i in (%FIND%) do (
    if not exist %%i (
        echo sorry, could not find %%i - exiting
        echo you can obtain the free GNU tools from gnuwin32.sourceforge.net
        exit /b
    )
)

REM see if the dokuwiki configuration file can be read
if not exist %DOKUWIKICONFIG% (
    echo sorry, could not find DokuWiki config at %DOKUWIKICONFIG% - exiting
    exit /b
)

REM grab the correct paths from the configuration file
for /f "usebackq delims=' tokens=2,4" %%i in (%DOKUWIKICONFIG%) do (
    if /i "%%i"=="datadir" set DOCUMENTROOT=%%j
    if /i "%%i"=="olddir" set ATTICDIR=%%j
    if /i "%%i"=="cachedir" set CACHEDIR=%%j
    if /i "%%i"=="lockdir" set LOCKDIR=%%j
)
if "%DOCUMENTROOT%" == "" (
    echo sorry, could not find datadir variable in %DOKUWIKICONFIG%, exiting...
    exit /b
)

REM use defaults if the paths are not specified
if /i "%ATTICDIR%" == "" set ATTICDIR=%DOCUMENTROOT%/attic
if /i "%LOCKDIR%" == "" set LOCKDIR=%DOCUMENTROOT%/lock
if /i "%CACHEDIR%" == "" set CACHEDIR=%DOCUMENTROOT%/cache

REM purge files older than DAYSTOKEEP days from the attic
%FIND% "%ATTICDIR%" -type f -mtime +%DAYSTOKEEP% -print > %TEMPFILE%
REM remove locks older than one day
%FIND% "%LOCKDIR%" -name "*.lock" -type f -mtime +1 -print >> %TEMPFILE%
REM remove cache files older than DAYSTOKEEP
%FIND% "%CACHEDIR%" -type f -mtime +%DAYSTOKEEP% -print >> %TEMPFILE%

REM show results, if any
for /f "usebackq" %%i in (`%FIND% "%TMP%" -size +1 -name %NAME%.tmp`) do (
    if /i "%SHOWRESULTSFIRST%"=="TRUE" (
        echo files to be deleted:
        type %TEMPFILE%
        pause
    )
    for /f "delims=#" %%i in (%TEMPFILE%) do del "%%i"
)

REM clean up
del /f /q %TEMPFILE%
 
endlocal

Udržování čistého pískoviště (Playground)

Pro udržení čistoty wiki Pískoviště a dalších stránek použijte cronjob, např. každých 30 minut, který obnoví Playground a další stránky do původního obsahu.

Příklad: Obnovení Playground každých 30 minut:

0,30 * * * * cp -f /path/to/savedwiki/data/pages/playground/playground.txt /path/to/dokuwiki/data/pages/playground/

Příklad: Obnovení všech stránek ve jmenném prostoru „wiki“ každých 30 minut:

0,30 * * * * cp -rf /path/to/savedwiki/data/pages/wiki/ /path/to/dokuwiki/data/pages/wiki/

Problémy s pluginem CAPTCHA

Použití pluginu CAPTCHA spolu s doporučenou metodou údržby pro čištění Playground může způsobit, že nebude možné Playground upravovat.

Když k tomu dojde, problém lze snadno vyřešit odstraněním souvisejících souborů Playground ve složce meta pomocí dalšího cronjobu.

Příklad: Smazání Playground metadat každých 30 minut:

0,30 * * * * rm -f /path/to/dokuwiki/data/meta/playground/playground.*

Když není dostupný cronjob

Pokud váš hosting neumožňuje použití cronjobů, zvažte použití pluginu cronojob.

Diskuze

Mohl by někdo prosím poskytnout PHP verze těchto skriptů pro použití s pluginem cronojob?


Ohledně výše uvedeného skriptu pro úklid, který používá čas poslední úpravy souboru (mtime) – nebylo by bezpečnější použít časové razítko v názvu souboru pro určení, zda má být soubor ve složce attic smazán?

Na jednu stranu bych řekl, že to možné je, ale samozřejmě je to složitější na nastavení. Pro mnoho instalací bude použití mtime dostačující. Na druhou stranu někteří mohou chtít mít jistotu, že se odstraní staré soubory bez ohledu na okolnosti (např. soubory zbylé po pádu nebo kritické chybě PHP).


Mohl by někdo přidat odpovídající řádek pro údržbu cache do Windows skriptu waRmZip?


Zvládá plugin cleanup všechny výše uvedené úkoly? Byl by doporučený místo spouštění těchto skriptů?


Toto je příklad PHP skriptu pro čištění starých cache souborů. Užitečné, když není možné spustit .sh skript.

cleanup.php
<?php
/*
 * mrlemonade ~
 */
function getFilesFromDir($dir) {
  $files = array();
  if ($handle = opendir($dir)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            if(is_dir($dir.'/'.$file)) {
                $dir2 = $dir.'/'.$file;
                $files[] = getFilesFromDir($dir2);
            }
            else {
              $files[] = $dir.'/'.$file;
            }
        }
    }
    closedir($handle);
  }
  return array_flat($files);
}
function array_flat($array) {
  foreach($array as $a) {
    if(is_array($a)) {
      $tmp = array_merge($tmp, array_flat($a));
    }
    else {
      $tmp[] = $a;
    }
  }
  return $tmp;
}
 
// Define the folder to clean
$captchaFolder = 'data/cache';
// Here you can define after how many
// days the files should get deleted
$expire_time = 5;
// Find all files of the given file type
foreach (getFilesFromDir($captchaFolder) as $Filename) {
        // Read file creation time
        $FileCreationTime = filectime($Filename);
        // Calculate file age in seconds
        $FileAge = time() - $FileCreationTime;
        // Is the file older than the given time span?
        if ($FileAge > ($expire_time*60*60*24 )) {
            // Now do something with the olders files...
            print "The file $Filename is older than $expire_time days \n";
            // For example deleting files:
            // unlink($Filename);
        }
}
echo 'ran';
?>

používáte na vlastní riziko. — S.C. Yoo 2012/02/10 12:49


Díky, rád bych dodal, že je dobrý nápad čistit osiřelá metadata, co myslíte? Dělám následující (v R skriptu):

  1. rekurzivně vypíšu všechny soubory ve složce pages
  2. přidám sloupec 'pagename', který obsahuje název souboru bez základní složky
  3. v pagename nahradím '/' (nebo '\') za ':' a odstraním příponu souboru
  4. udělám totéž pro složku meta + vyloučím některé soubory
  5. odstraním všechny položky ze seznamu meta, jejichž název stránky je v seznamu pages
  6. smažu všechny zbývající soubory v seznamu meta

Samozřejmě lze přidat časové omezení, aby se metadata nepoužívala ihned.

Clemo 2016/09/23 někdy

1)
Diskuzi o údržbě cache najdete také na fóru.
tips/maintenance.txt • Poslední změna: (upraveno správcem (MartinR) mimo DokuWiki)

Pokud není uvedeno jinak, je obsah této wiki dostupný pod licencí:
CC-BY-SA • Uveďte původ - Zachovejte licenci 4.0 Mezinárodní
CC-BY-SA • Uveďte původ - Zachovejte licenci 4.0 Mezinárodní Darovat Běží na PHP Validátor HTML5 Validátor CSS Běží na DokuWiki

Našli jste na stránce chybu, nebo překlep?
Budu vděčný za upozornění.
Děkuji

Nahoru