CINXE.COM
tips:maintenance [DokuWiki]
<!DOCTYPE html> <html lang="en" dir="ltr" class="no-js"> <head> <meta charset="utf-8" /> <title>tips:maintenance [DokuWiki]</title> <meta name="generator" content="DokuWiki"/> <meta name="theme-color" content="#008800"/> <meta name="robots" content="index,follow"/> <meta name="keywords" content="tips,maintenance"/> <link rel="search" type="application/opensearchdescription+xml" href="/lib/exe/opensearch.php" title="DokuWiki"/> <link rel="start" href="/"/> <link rel="contents" href="/tips:maintenance?do=index" title="Sitemap"/> <link rel="manifest" href="/lib/exe/manifest.php"/> <link rel="alternate" type="application/rss+xml" title="Recent Changes" href="/feed.php"/> <link rel="alternate" type="application/rss+xml" title="Current namespace" href="/feed.php?mode=list&ns=tips"/> <link rel="edit" title="Edit this page" href="/tips:maintenance?do=edit"/> <link rel="alternate" type="text/html" title="Plain HTML" href="/_export/xhtml/tips:maintenance"/> <link rel="alternate" type="text/plain" title="Wiki Markup" href="/_export/raw/tips:maintenance"/> <link rel="canonical" href="https://www.dokuwiki.org/tips:maintenance"/> <link rel="stylesheet" href="/lib/exe/css.php?t=dokuwiki&tseed=f1005bad3d81fc9c803c7f93d32a390e"/> <link rel="alternate" hreflang="de" href="https://www.dokuwiki.org/de:tips:maintenance"/> <link rel="alternate" hreflang="ja" href="https://www.dokuwiki.org/ja:tips:maintenance"/> <link rel="alternate" hreflang="pl" href="https://www.dokuwiki.org/pl:tips:maintenance"/> <link rel="alternate" hreflang="ru" href="https://www.dokuwiki.org/ru:tips:maintenance"/> <link rel="alternate" hreflang="zh" href="https://www.dokuwiki.org/zh:tips:maintenance"/> <link rel="alternate" hreflang="x-default" href="https://www.dokuwiki.org/tips:maintenance"/> <script >var NS='tips';var JSINFO = {"plugins":{"edittable":{"default columnwidth":""}},"id":"tips:maintenance","namespace":"tips","ACT":"show","useHeadingNavigation":0,"useHeadingContent":0};(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js" defer="defer"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js" defer="defer"></script> <script src="/lib/exe/js.php?t=dokuwiki&tseed=f1005bad3d81fc9c803c7f93d32a390e&lang=en" defer="defer"></script> <meta name="viewport" content="width=device-width,initial-scale=1" /> <link rel="shortcut icon" href="/lib/tpl/dokuwiki/images/favicon.ico" /> <link rel="apple-touch-icon" href="/lib/tpl/dokuwiki/images/apple-touch-icon.png" /> <meta name="verify-v1" content="OVxl3gsCv2MhZqh1cBQyl0JytWXSwXMjyvwc+4w3WtA=" /> <meta name="google-site-verification" content="YhTVK69hW94ZXUtc2zSLPxTkZKbZIn0zK67mz5WQB-E" /> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-83791-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-83791-1', { 'anonymize_ip': true }); </script> </head> <body> <div id="dokuwiki__site"><div id="dokuwiki__top" class="site dokuwiki mode_show tpl_dokuwiki showSidebar hasSidebar"> <!-- ********** HEADER ********** --> <header id="dokuwiki__header"><div class="pad group"> <div class="headings group"> <ul class="a11y skip"> <li><a href="#dokuwiki__content">skip to content</a></li> </ul> <h1 class="logo"><a href="/start" accesskey="h" title="Home [h]"><img src="/lib/tpl/dokuwiki/images/logo.png" width="64" height="64" alt="" /><span>DokuWiki</span></a></h1> <p class="claim">It's better when it's simple</p> </div> <div class="tools group"> <!-- USER TOOLS --> <div id="dokuwiki__usertools"> <h3 class="a11y">User Tools</h3> <ul> <li class="action login"><a href="/tips:maintenance?do=login&sectok=" title="Log In" rel="nofollow"><span>Log In</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 17.25V14H3v-4h7V6.75L15.25 12 10 17.25M8 2h9a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-4h2v4h9V4H8v4H6V4a2 2 0 0 1 2-2z"/></svg></a></li> </ul> </div> <!-- SITE TOOLS --> <div id="dokuwiki__sitetools"> <h3 class="a11y">Site Tools</h3> <form action="/start" method="get" role="search" class="search doku_form" id="dw__search" accept-charset="utf-8"><input type="hidden" name="do" value="search" /><input type="hidden" name="id" value="tips:maintenance" /><div class="no"><input name="q" type="text" class="edit" title="[F]" accesskey="f" placeholder="Search" autocomplete="on" id="qsearch__in" value="" /><button value="1" type="submit" title="Search">Search</button><div id="qsearch__out" class="ajax_qsearch JSpopup"></div></div></form> <div class="mobileTools"> <form action="/doku.php" method="get" accept-charset="utf-8"><div class="no"><input type="hidden" name="id" value="tips:maintenance" /><select name="do" class="edit quickselect" title="Tools"><option value="">Tools</option><optgroup label="Page Tools"><option value="edit">Edit this page</option><option value="revisions">Old revisions</option><option value="backlink">Backlinks</option></optgroup><optgroup label="Site Tools"><option value="recent">Recent Changes</option><option value="media">Media Manager</option><option value="index">Sitemap</option></optgroup><optgroup label="User Tools"><option value="login">Log In</option></optgroup></select><button type="submit">></button></div></form> </div> <ul> <li class="action recent"><a href="/tips:maintenance?do=recent" title="Recent Changes [r]" rel="nofollow" accesskey="r">Recent Changes</a></li><li class="action media"><a href="/tips:maintenance?do=media&ns=tips" title="Media Manager" rel="nofollow">Media Manager</a></li><li class="action index"><a href="/tips:maintenance?do=index" title="Sitemap [x]" rel="nofollow" accesskey="x">Sitemap</a></li> </ul> </div> </div> <!-- BREADCRUMBS --> <div class="breadcrumbs"> <div class="trace"><span class="bchead">Trace:</span> <span class="bcsep">•</span> <span class="curid"><bdi><a href="/tips:maintenance" class="breadcrumbs" title="tips:maintenance">maintenance</a></bdi></span></div> </div> <hr class="a11y" /> </div></header><!-- /header --> <div class="wrapper group"> <!-- ********** ASIDE ********** --> <nav id="dokuwiki__aside" aria-label="Sidebar"><div class="pad aside include group"> <h3 class="toggle">Sidebar</h3> <div class="content"><div class="group"> <div class="plugin_translation is-dropdown"><span class="title">Translations of this page<sup><a href="/localization" class="wikilink1" title="localization" data-wiki-id="localization">?</a></sup>: </span><ul><li class="span"><span class="wikilink1" title="English">English (en)</span></li><li class="a"><a class="wikilink2" title="|العربية" href="/ar:tips:maintenance">|العربية (ar)</a></li><li class="a"><a class="wikilink2" title="Català" href="/ca:tips:maintenance">Català (ca)</a></li><li class="a"><a class="wikilink2" title="Česky" href="/cs:tips:maintenance">Česky (cs)</a></li><li class="a"><a class="wikilink2" title="Dansk" href="/da:tips:maintenance">Dansk (da)</a></li><li class="a"><a class="wikilink1" title="Deutsch" href="/de:tips:maintenance">Deutsch (de)</a></li><li class="a"><a class="wikilink2" title="Ελληνικά" href="/el:tips:maintenance">Ελληνικά (el)</a></li><li class="a"><a class="wikilink2" title="Esperanto" href="/eo:tips:maintenance">Esperanto (eo)</a></li><li class="a"><a class="wikilink2" title="Español" href="/es:tips:maintenance">Español (es)</a></li><li class="a"><a class="wikilink2" title="فارسی" href="/fa:tips:maintenance">فارسی (fa)</a></li><li class="a"><a class="wikilink2" title="Français" href="/fr:tips:maintenance">Français (fr)</a></li><li class="a"><a class="wikilink2" title="עברית" href="/he:tips:maintenance">עברית (he)</a></li><li class="a"><a class="wikilink2" title="Magyar" href="/hu:tips:maintenance">Magyar (hu)</a></li><li class="a"><a class="wikilink2" title="Italiano" href="/it:tips:maintenance">Italiano (it)</a></li><li class="a"><a class="wikilink1" title="日本語" href="/ja:tips:maintenance">日本語 (ja)</a></li><li class="a"><a class="wikilink2" title="한국어" href="/ko:tips:maintenance">한국어 (ko)</a></li><li class="a"><a class="wikilink2" title="Lietuvių Kalba" href="/lt:tips:maintenance">Lietuvių Kalba (lt)</a></li><li class="a"><a class="wikilink2" title="Nederlands" href="/nl:tips:maintenance">Nederlands (nl)</a></li><li class="a"><a class="wikilink2" title="Norsk" href="/no:tips:maintenance">Norsk (no)</a></li><li class="a"><a class="wikilink1" title="Polski" href="/pl:tips:maintenance">Polski (pl)</a></li><li class="a"><a class="wikilink2" title="Português" href="/pt-br:tips:maintenance">Português (pt-br)</a></li><li class="a"><a class="wikilink2" title="Română" href="/ro:tips:maintenance">Română (ro)</a></li><li class="a"><a class="wikilink1" title="Русский" href="/ru:tips:maintenance">Русский (ru)</a></li><li class="a"><a class="wikilink2" title="Српски Језик" href="/sr:tips:maintenance">Српски Језик (sr)</a></li><li class="a"><a class="wikilink2" title="Svenska" href="/sv:tips:maintenance">Svenska (sv)</a></li><li class="a"><a class="wikilink2" title="ไทย" href="/th:tips:maintenance">ไทย (th)</a></li><li class="a"><a class="wikilink2" title="Українська" href="/uk:tips:maintenance">Українська (uk)</a></li><li class="a"><a class="wikilink1" title="中文" href="/zh:tips:maintenance">中文 (zh)</a></li><li class="a"><a class="wikilink2" title="繁體中文" href="/zh-tw:tips:maintenance">繁體中文 (zh-tw)</a></li></ul></div> <p> <strong>Learn about DokuWiki</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/features" class="wikilink1" title="features" data-wiki-id="features">Features</a> & <a href="/blogroll" class="wikilink1" title="blogroll" data-wiki-id="blogroll">reviews</a> </div> </li> <li class="level1"><div class="li"> <a href="/install" class="wikilink1" title="install" data-wiki-id="install">Installation guide</a></div> </li> <li class="level1"><div class="li"> <a href="/manual" class="wikilink1" title="manual" data-wiki-id="manual">User manual</a> & <a href="/wiki:syntax" class="wikilink1" title="wiki:syntax" data-wiki-id="wiki:syntax">syntax</a></div> </li> <li class="level1"><div class="li"> <a href="/changes" class="wikilink1" title="changes" data-wiki-id="changes">Release notes</a></div> </li> <li class="level1"><div class="li"> <a href="/faq" class="wikilink1" title="faq" data-wiki-id="faq">FAQ</a></div> </li> </ul> <p> <strong>Advanced Use</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/extensions" class="wikilink1" title="extensions" data-wiki-id="extensions">Extensions</a></div> </li> <li class="level1"><div class="li"> <a href="/development" class="wikilink1" title="development" data-wiki-id="development">Development manual</a></div> </li> </ul> <p> <strong>Corporate Use</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/faq:support" class="wikilink1" title="faq:support" data-wiki-id="faq:support">Get support</a></div> </li> <li class="level1"><div class="li"> <a href="/donate" class="wikilink1" title="donate" data-wiki-id="donate">Donations</a></div> </li> </ul> <p> <strong>Our Community</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/teams:getting_involved" class="wikilink1" title="teams:getting_involved" data-wiki-id="teams:getting_involved">Get involved</a></div> </li> <li class="level1"><div class="li"> <a href="/dokuinstall" class="wikilink1" title="dokuinstall" data-wiki-id="dokuinstall">Users</a></div> </li> <li class="level1"><div class="li"> <a href="http://forum.dokuwiki.org" class="urlextern" title="http://forum.dokuwiki.org">User forum</a></div> </li> <li class="level1"><div class="li"> <a href="/mailinglist" class="wikilink1" title="mailinglist" data-wiki-id="mailinglist">Development mailinglist</a></div> </li> </ul> <hr /> <p> Follow us on <a href="https://phpc.social/@dokuwiki" class="urlextern" title="https://phpc.social/@dokuwiki">Mastodon</a> and other <a href="/social" class="wikilink1" title="social" data-wiki-id="social">social networks</a>. </p> <p> <a href="/privacy" class="wikilink1" title="privacy" data-wiki-id="privacy">Our Privacy Policy</a> </p> </div></div> </div></nav><!-- /aside --> <!-- ********** CONTENT ********** --> <main id="dokuwiki__content"><div class="pad group"> <div class="pageId"><span>tips:maintenance</span></div> <div class="page group"> <!-- wikipage start --> <!-- TOC START --> <div id="dw__toc" class="dw__toc"> <h3 class="toggle">Table of Contents</h3> <div> <ul class="toc"> <li class="level1"><div class="li"><a href="#maintenance">Maintenance</a></div> <ul class="toc"> <li class="level2"><div class="li"><a href="#keep_blacklist_up_to_date">Keep Blacklist up to date</a></div></li> <li class="level2"><div class="li"><a href="#automatic_cleanup_script">Automatic cleanup script</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#windows_--_warmzip">Windows -- warmzip</a></div></li> <li class="level3"><div class="li"><a href="#windows_--_batch_script">Windows -- batch script</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#keeping_playground_clean">Keeping Playground Clean</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#problems_with_captcha_plugin">Problems with CAPTCHA plugin</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#when_cronjob_is_not_available">When cronjob is not available</a></div></li> <li class="level2"><div class="li"><a href="#discussion">Discussion</a></div></li> </ul></li> </ul> </div> </div> <!-- TOC END --> <h1 class="sectionedit1" id="maintenance">Maintenance</h1> <div class="level1"> <p> Here are some tips to automate some of the day-to-day maintenance needed or recommended for DokuWiki. </p> <p> See also the plugins: <a href="/plugin:cleanup" class="wikilink1" title="plugin:cleanup" data-wiki-id="plugin:cleanup">cleanup</a> and <a href="/plugin:clearhistory" class="wikilink1" title="plugin:clearhistory" data-wiki-id="plugin:clearhistory">clearhistory</a> </p> </div> <div class="secedit editbutton_section editbutton_1"><form class="button btn_secedit" method="post" action="/tips:maintenance"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1696962513" /><input type="hidden" name="summary" value="[Maintenance] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="maintenance" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1-222" /><button type="submit" title="Maintenance">Edit</button></div></form></div> <h2 class="sectionedit2" id="keep_blacklist_up_to_date">Keep Blacklist up to date</h2> <div class="level2"> <p> See <a href="/blacklist" class="wikilink1" title="blacklist" data-wiki-id="blacklist">blacklist</a> on how to set up a cronjob to keep the Anti-Spam Blacklist current. </p> </div> <div class="secedit editbutton_section editbutton_2"><form class="button btn_secedit" method="post" action="/tips:maintenance"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1696962513" /><input type="hidden" name="summary" value="[Keep Blacklist up to date] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="keep_blacklist_up_to_date" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="223-349" /><button type="submit" title="Keep Blacklist up to date">Edit</button></div></form></div> <h2 class="sectionedit3" id="automatic_cleanup_script">Automatic cleanup script</h2> <div class="level2"> <p> It is recommended to set up some cleanup process for busy DokuWikis. The following <a href="https://en.wikipedia.org/wiki/Bash (Unix shell)" class="interwiki iw_wp" title="https://en.wikipedia.org/wiki/Bash (Unix shell)">Bash (Unix shell)</a> shell script serves as an example. It deletes old revisions from the <a href="/attic" class="wikilink1" title="attic" data-wiki-id="attic">attic</a>, removes stale lock files and empty directories, and it cleans up the <a href="/caching" class="wikilink1" title="caching" data-wiki-id="caching">cache</a><sup><a href="#fn__1" id="fnt__1" class="fn_top">1)</a></sup>. </p> <dl class="file"> <dt><a href="/_export/code/tips:maintenance?codeblock=0" title="Download Snippet" class="mediafile mf_sh">cleanup.sh</a></dt> <dd><pre class="code file bash"><span class="co0">#!/bin/bash</span> cleanup<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw3">local</span> <span class="re2">data_path</span>=<span class="st0">"$1"</span> <span class="co0"># full path to data directory of wiki</span> <span class="kw3">local</span> <span class="re2">retention_days</span>=<span class="st0">"$2"</span> <span class="co0"># number of days after which old files are to be removed</span> <span class="co0"># purge files older than ${retention_days} days from attic and media_attic (old revisions)</span> <span class="kw2">find</span> <span class="st0">"<span class="es3">${data_path}</span>"</span><span class="sy0">/</span><span class="br0">{</span>media_,<span class="br0">}</span>attic<span class="sy0">/</span> <span class="re5">-type</span> f <span class="re5">-not</span> <span class="re5">-name</span> _dummy <span class="re5">-mtime</span> +<span class="st0">"<span class="es3">${retention_days}</span>"</span> <span class="re5">-delete</span> <span class="co0"># remove stale lock files (files which are 1-2 days old)</span> <span class="kw2">find</span> <span class="st0">"<span class="es3">${data_path}</span>"</span><span class="sy0">/</span>locks<span class="sy0">/</span> <span class="re5">-name</span> <span class="st_h">'*.lock'</span> <span class="re5">-type</span> f <span class="re5">-mtime</span> +<span class="nu0">1</span> <span class="re5">-delete</span> <span class="co0"># remove empty directories</span> <span class="kw2">find</span> <span class="st0">"<span class="es3">${data_path}</span>"</span><span class="sy0">/</span><span class="br0">{</span>attic,cache,index,locks,media,media_attic,media_meta,meta,pages,tmp<span class="br0">}</span><span class="sy0">/</span> \ <span class="re5">-mindepth</span> <span class="nu0">1</span> <span class="re5">-type</span> d <span class="re5">-empty</span> <span class="re5">-delete</span> <span class="co0"># remove files older than ${retention_days} days from the cache</span> <span class="kw1">if</span> <span class="kw3">test</span> <span class="re5">-n</span> <span class="st0">"<span class="es4">$(find "${data_path}"/cache/?/ -maxdepth 1 -print -quit &> /dev/null)</span>"</span> <span class="kw1">then</span> <span class="kw2">find</span> <span class="st0">"<span class="es3">${data_path}</span>"</span><span class="sy0">/</span>cache<span class="sy0">/</span>?<span class="sy0">/</span> <span class="re5">-type</span> f <span class="re5">-not</span> <span class="re5">-name</span> _dummy <span class="re5">-mtime</span> +<span class="st0">"<span class="es3">${retention_days}</span>"</span> <span class="re5">-delete</span> <span class="kw1">fi</span> <span class="br0">}</span> <span class="co0"># cleanup DokuWiki installations (path to datadir, number of days)</span> <span class="co0"># some examples:</span> cleanup <span class="sy0">/</span>home<span class="sy0">/</span>user1<span class="sy0">/</span>htdocs<span class="sy0">/</span>doku<span class="sy0">/</span>data <span class="nu0">256</span> cleanup <span class="sy0">/</span>home<span class="sy0">/</span>user2<span class="sy0">/</span>htdocs<span class="sy0">/</span>mywiki<span class="sy0">/</span>data <span class="nu0">180</span> cleanup <span class="sy0">/</span>var<span class="sy0">/</span>www<span class="sy0">/</span>superwiki<span class="sy0">/</span>data <span class="nu0">180</span></pre> </dd></dl> <p> To run it automatically, set up a <a href="http://man.cx/crontab%285%29" class="interwiki iw_man" title="http://man.cx/crontab%285%29">cronjob</a>. The following example calls the script every day 7 minutes after midnight. To run as non-root user remove <code>root</code>. </p> <pre class="code">7 0 * * * root /full/path/to/cleanup.sh</pre> <p> Be sure to set everything up correctly - you don't want to delete the wrong things, do you? </p> </div> <div class="secedit editbutton_section editbutton_3"><form class="button btn_secedit" method="post" action="/tips:maintenance"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1696962513" /><input type="hidden" name="summary" value="[Automatic cleanup script] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="automatic_cleanup_script" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="350-2310" /><button type="submit" title="Automatic cleanup script">Edit</button></div></form></div> <h3 class="sectionedit4" id="windows_--_warmzip">Windows -- warmzip</h3> <div class="level3"> <p> A script for cleaning out old files on Windows systems is <a href="http://winadmin.tumblr.com/post/8005353779/warmzip-clean-up-folders-by-compressing-moving" class="urlextern" title="http://winadmin.tumblr.com/post/8005353779/warmzip-clean-up-folders-by-compressing-moving">waRmZip</a>, available from <a href="http://sourceforge.net/project/showfiles.php?group_id=88417" class="urlextern" title="http://sourceforge.net/project/showfiles.php?group_id=88417">here on SourceForge</a>. Write a batch file to call it, and schedule it to run every day. And as the man says: 'Be sure to set everything up correctly' <img src="/lib/images/smileys/wink.svg" class="icon smiley" alt=";-)" /> </p> <p> I took the above suggestion to use <code>waRmZip</code> and wrote this batch file - maybe it will help out. </p> <p> My favorite way to run cron jobs on Windows is <a href="https://sourceforge.net/projects/pycron" class="urlextern" title="https://sourceforge.net/projects/pycron">PyCron</a>. </p> <dl class="file"> <dt><a href="/_export/code/tips:maintenance?codeblock=1" title="Download Snippet" class="mediafile mf_bat">dw-cleanup.bat</a></dt> <dd><pre class="code file dos"><span class="sy0">@</span><a href="http://www.ss64.com/nt/echo.html"><span class="kw3">echo</span></a> off <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> waRmZip="c:\Program Files\waRmZip\waRmZip.wsf" <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> wikiHome="c:\path\to\htdocs\wiki\data" <span class="co1"> rem Move attic files older than 30 days to an archive location</span> <span class="sy0">%</span><span class="re3">waRmZip</span><span class="sy0">%</span> <span class="sy0">%</span><span class="re3">wikiHome</span><span class="sy0">%</span>\attic /ma:30 /<a href="http://www.ss64.com/nt/md.html"><span class="kw3">md</span></a>:<span class="sy0">%</span><span class="re3">wikiHome</span><span class="sy0">%</span>_archive\attic /r /q <span class="co1"> rem Option: delete attic files older than 30 days</span> <span class="co1">rem %waRmZip% %wikiHome%\attic /da:30 /dc /r /q</span> <span class="co1"> rem Delete empty attic directories; waRmZip requires the /da flag when using</span> <span class="co1">rem /df, so add filter for *.zzz so /da doesn't remove any files</span> <span class="sy0">%</span><span class="re3">waRmZip</span><span class="sy0">%</span> <span class="sy0">%</span><span class="re3">wikiHome</span><span class="sy0">%</span>\attic /r /da:31 /df /fo:*.zzz /q <span class="co1"> rem Remove stale lock files</span> <span class="sy0">%</span><span class="re3">waRmZip</span><span class="sy0">%</span> <span class="sy0">%</span><span class="re3">wikiHome</span><span class="sy0">%</span>\locks /da:1 /fo:*.lock /r /q <span class="co1"> rem Remove empty directories</span> <span class="sy0">%</span><span class="re3">waRmZip</span><span class="sy0">%</span> <span class="sy0">%</span><span class="re3">wikiHome</span><span class="sy0">%</span>\pages /da:365 /df /fo:*.zzz /r /q</pre> </dd></dl> </div> <div class="secedit editbutton_section editbutton_4"><form class="button btn_secedit" method="post" action="/tips:maintenance"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1696962513" /><input type="hidden" name="summary" value="[Windows -- warmzip] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="windows_--_warmzip" /><input type="hidden" name="codeblockOffset" value="1" /><input type="hidden" name="range" value="2311-3665" /><button type="submit" title="Windows -- warmzip">Edit</button></div></form></div> <h3 class="sectionedit5" id="windows_--_batch_script">Windows -- batch script</h3> <div class="level3"> <p> This is another Windows command shell script for maintaining your dokuwiki base on a Windows environment. The script uses the free and open source utility find, which can be obtained via <a href="http://gnuwin32.sourceforge.net/" class="urlextern" title="http://gnuwin32.sourceforge.net/">http://gnuwin32.sourceforge.net/</a> </p> <p> All paths are read from the DokuWiki config file. Files to be deleted can be shown before deletion, to prevent accidental deletion of files. </p> <dl class="file"> <dt><a href="/_export/code/tips:maintenance?codeblock=2" title="Download Snippet" class="mediafile mf_cmd">maintain_dokuwiki.cmd</a></dt> <dd><pre class="code file dos"><span class="sy0">@</span><a href="http://www.ss64.com/nt/echo.html"><span class="kw3">echo</span></a> off <a href="http://www.ss64.com/nt/setlocal.html"><span class="kw3">setlocal</span></a> <span class="co1"> REM This script performs some basic DokuWiki maintenance</span> <span class="co1"> REM Copyright (C) 2012 Peter Mosmans</span> <span class="co1"> REM This program is free software: you can redistribute it and/or modify</span> <span class="co1">REM it under the terms of the GNU General Public License as published by</span> <span class="co1">REM the Free Software Foundation, either version 3 of the License, or</span> <span class="co1">REM (at your option) any later version.</span> <span class="co1"> REM This program is distributed in the hope that it will be useful,</span> <span class="co1">REM but WITHOUT ANY WARRANTY; without even the implied warranty of</span> <span class="co1">REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span> <span class="co1">REM GNU General Public License for more details.</span> <span class="co1"> REM You should have received a copy of the GNU General Public License</span> <span class="co1">REM along with this program. If not, see <http://www.gnu.org/licenses/>.</span> <span class="co1"> REM Please contact support AT go-forward.net for questions and/or feedback</span> <span class="co1"> REM Last modification: 02-05-2012 (Peter Mosmans)</span> <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> NAME=maintain_dokuwiki <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> VERSION=0.13 <span class="co1"> REM path to the dokuwiki configuration file enclosed in double quotes</span> <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> DOKUWIKICONFIG="\full\filename\of\your\dokuwiki\conf\local.php" <span class="co1">REM preserve all files that are younger than DAYSTOKEEP days</span> <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> DAYSTOKEEP=31 <span class="co1">REM set to true if you want to show results and pause before deleting any files</span> <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> SHOWRESULTSFIRST=true <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> FIND=c:\tools\find.exe <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> TEMPFILE=<span class="sy0">%</span><span class="re3">TMP</span><span class="sy0">%</span>\<span class="sy0">%</span><span class="re3">NAME</span><span class="sy0">%</span>.tmp <span class="co1"> REM see if all tools are present</span> <a href="http://www.ss64.com/nt/for.html"><span class="kw1">for</span></a> <span class="sy0">%%</span><span class="re3">i</span> <a href="http://www.ss64.com/nt/in.html"><span class="kw1">in</span></a> <span class="sy0">(%</span><span class="re3">FIND</span><span class="sy0">%)</span> <a href="http://www.ss64.com/nt/do.html"><span class="kw1">do</span></a> <span class="sy0">(</span> <a href="http://www.ss64.com/nt/if.html"><span class="kw1">if</span></a> <a href="http://www.ss64.com/nt/not.html"><span class="kw2">not</span></a> <a href="http://www.ss64.com/nt/exist.html"><span class="kw2">exist</span></a> <span class="sy0">%%</span><span class="re3">i</span> <span class="sy0">(</span> <a href="http://www.ss64.com/nt/echo.html"><span class="kw3">echo</span></a> sorry, could <a href="http://www.ss64.com/nt/not.html"><span class="kw2">not</span></a> find <span class="sy0">%%</span><span class="re3">i</span> - exiting <a href="http://www.ss64.com/nt/echo.html"><span class="kw3">echo</span></a> you can obtain the free GNU tools from gnuwin32.sourceforge.net <a href="http://www.ss64.com/nt/exit.html"><span class="kw1">exit</span></a> /b <span class="sy0">)</span> <span class="sy0">)</span> <span class="co1"> REM see if the dokuwiki configuration file can be read</span> <a href="http://www.ss64.com/nt/if.html"><span class="kw1">if</span></a> <a href="http://www.ss64.com/nt/not.html"><span class="kw2">not</span></a> <a href="http://www.ss64.com/nt/exist.html"><span class="kw2">exist</span></a> <span class="sy0">%</span><span class="re3">DOKUWIKICONFIG</span><span class="sy0">%</span> <span class="sy0">(</span> <a href="http://www.ss64.com/nt/echo.html"><span class="kw3">echo</span></a> sorry, could <a href="http://www.ss64.com/nt/not.html"><span class="kw2">not</span></a> find DokuWiki config at <span class="sy0">%</span><span class="re3">DOKUWIKICONFIG</span><span class="sy0">%</span> - exiting <a href="http://www.ss64.com/nt/exit.html"><span class="kw1">exit</span></a> /b <span class="sy0">)</span> <span class="co1"> REM grab the correct paths from the configuration file</span> <a href="http://www.ss64.com/nt/for.html"><span class="kw1">for</span></a> /f "usebackq delims=' tokens=2,4" <span class="sy0">%%</span><span class="re3">i</span> <a href="http://www.ss64.com/nt/in.html"><span class="kw1">in</span></a> <span class="sy0">(%</span><span class="re3">DOKUWIKICONFIG</span><span class="sy0">%)</span> <a href="http://www.ss64.com/nt/do.html"><span class="kw1">do</span></a> <span class="sy0">(</span> <a href="http://www.ss64.com/nt/if.html"><span class="kw1">if</span></a> /i "<span class="sy0">%%</span><span class="re3">i</span>"=="datadir" <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> DOCUMENTROOT=<span class="sy0">%%</span><span class="re3">j</span> <a href="http://www.ss64.com/nt/if.html"><span class="kw1">if</span></a> /i "<span class="sy0">%%</span><span class="re3">i</span>"=="olddir" <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> ATTICDIR=<span class="sy0">%%</span><span class="re3">j</span> <a href="http://www.ss64.com/nt/if.html"><span class="kw1">if</span></a> /i "<span class="sy0">%%</span><span class="re3">i</span>"=="cachedir" <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> CACHEDIR=<span class="sy0">%%</span><span class="re3">j</span> <a href="http://www.ss64.com/nt/if.html"><span class="kw1">if</span></a> /i "<span class="sy0">%%</span><span class="re3">i</span>"=="lockdir" <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> LOCKDIR=<span class="sy0">%%</span><span class="re3">j</span> <span class="sy0">)</span> <a href="http://www.ss64.com/nt/if.html"><span class="kw1">if</span></a> "<span class="sy0">%</span><span class="re3">DOCUMENTROOT</span><span class="sy0">%</span>" == "" <span class="sy0">(</span> <a href="http://www.ss64.com/nt/echo.html"><span class="kw3">echo</span></a> sorry, could <a href="http://www.ss64.com/nt/not.html"><span class="kw2">not</span></a> find datadir variable <a href="http://www.ss64.com/nt/in.html"><span class="kw1">in</span></a> <span class="sy0">%</span><span class="re3">DOKUWIKICONFIG</span><span class="sy0">%</span>, exiting... <a href="http://www.ss64.com/nt/exit.html"><span class="kw1">exit</span></a> /b <span class="sy0">)</span> <span class="co1"> REM use defaults if the paths are not specified</span> <a href="http://www.ss64.com/nt/if.html"><span class="kw1">if</span></a> /i "<span class="sy0">%</span><span class="re3">ATTICDIR</span><span class="sy0">%</span>" == "" <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> ATTICDIR=<span class="sy0">%</span><span class="re3">DOCUMENTROOT</span><span class="sy0">%</span>/attic <a href="http://www.ss64.com/nt/if.html"><span class="kw1">if</span></a> /i "<span class="sy0">%</span><span class="re3">LOCKDIR</span><span class="sy0">%</span>" == "" <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> LOCKDIR=<span class="sy0">%</span><span class="re3">DOCUMENTROOT</span><span class="sy0">%</span>/lock <a href="http://www.ss64.com/nt/if.html"><span class="kw1">if</span></a> /i "<span class="sy0">%</span><span class="re3">CACHEDIR</span><span class="sy0">%</span>" == "" <a href="http://www.ss64.com/nt/set.html"><span class="kw3">set</span></a> CACHEDIR=<span class="sy0">%</span><span class="re3">DOCUMENTROOT</span><span class="sy0">%</span>/cache <span class="co1"> REM purge files older than DAYSTOKEEP days from the attic</span> <span class="sy0">%</span><span class="re3">FIND</span><span class="sy0">%</span> "<span class="sy0">%</span><span class="re3">ATTICDIR</span><span class="sy0">%</span>" -type f -mtime +<span class="sy0">%</span><span class="re3">DAYSTOKEEP</span><span class="sy0">%</span> -print <span class="sy0">></span> <span class="sy0">%</span><span class="re3">TEMPFILE</span><span class="sy0">%</span> <span class="co1">REM remove locks older than one day</span> <span class="sy0">%</span><span class="re3">FIND</span><span class="sy0">%</span> "<span class="sy0">%</span><span class="re3">LOCKDIR</span><span class="sy0">%</span>" -name "*.lock" -type f -mtime +1 -print <span class="sy0">>></span> <span class="sy0">%</span><span class="re3">TEMPFILE</span><span class="sy0">%</span> <span class="co1">REM remove cache files older than DAYSTOKEEP</span> <span class="sy0">%</span><span class="re3">FIND</span><span class="sy0">%</span> "<span class="sy0">%</span><span class="re3">CACHEDIR</span><span class="sy0">%</span>" -type f -mtime +<span class="sy0">%</span><span class="re3">DAYSTOKEEP</span><span class="sy0">%</span> -print <span class="sy0">>></span> <span class="sy0">%</span><span class="re3">TEMPFILE</span><span class="sy0">%</span> <span class="co1"> REM show results, if any</span> <a href="http://www.ss64.com/nt/for.html"><span class="kw1">for</span></a> /f "usebackq" <span class="sy0">%%</span><span class="re3">i</span> <a href="http://www.ss64.com/nt/in.html"><span class="kw1">in</span></a> <span class="sy0">(</span>`<span class="sy0">%</span><span class="re3">FIND</span><span class="sy0">%</span> "<span class="sy0">%</span><span class="re3">TMP</span><span class="sy0">%</span>" -size +1 -name <span class="sy0">%</span><span class="re3">NAME</span><span class="sy0">%</span>.tmp`<span class="sy0">)</span> <a href="http://www.ss64.com/nt/do.html"><span class="kw1">do</span></a> <span class="sy0">(</span> <a href="http://www.ss64.com/nt/if.html"><span class="kw1">if</span></a> /i "<span class="sy0">%</span><span class="re3">SHOWRESULTSFIRST</span><span class="sy0">%</span>"=="TRUE" <span class="sy0">(</span> <a href="http://www.ss64.com/nt/echo.html"><span class="kw3">echo</span></a> files to be deleted: type <span class="sy0">%</span><span class="re3">TEMPFILE</span><span class="sy0">%</span> <a href="http://www.ss64.com/nt/pause.html"><span class="kw3">pause</span></a> <span class="sy0">)</span> <a href="http://www.ss64.com/nt/for.html"><span class="kw1">for</span></a> /f "delims=#" <span class="sy0">%%</span><span class="re3">i</span> <a href="http://www.ss64.com/nt/in.html"><span class="kw1">in</span></a> <span class="sy0">(%</span><span class="re3">TEMPFILE</span><span class="sy0">%)</span> <a href="http://www.ss64.com/nt/do.html"><span class="kw1">do</span></a> <a href="http://www.ss64.com/nt/del.html"><span class="kw3">del</span></a> "<span class="sy0">%%</span><span class="re3">i</span>" <span class="sy0">)</span> <span class="co1"> REM clean up</span> <a href="http://www.ss64.com/nt/del.html"><span class="kw3">del</span></a> /f /q <span class="sy0">%</span><span class="re3">TEMPFILE</span><span class="sy0">%</span> <a href="http://www.ss64.com/nt/endlocal.html"><span class="kw3">endlocal</span></a></pre> </dd></dl> </div> <div class="secedit editbutton_section editbutton_5"><form class="button btn_secedit" method="post" action="/tips:maintenance"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1696962513" /><input type="hidden" name="summary" value="[Windows -- batch script] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="windows_--_batch_script" /><input type="hidden" name="codeblockOffset" value="2" /><input type="hidden" name="range" value="3666-7164" /><button type="submit" title="Windows -- batch script">Edit</button></div></form></div> <h2 class="sectionedit6" id="keeping_playground_clean">Keeping Playground Clean</h2> <div class="level2"> <p> To keep the wiki's <a href="/playground:playground" class="wikilink1" title="playground:playground" data-wiki-id="playground:playground">Playground</a> and other pages clean, use a cron job e.g. every 30 minutes, that restores Playground and other pages to their original content. </p> <p> Example: Restore Playground every 30 min: </p> <pre class="code">0,30 * * * * cp -f /path/to/savedwiki/data/pages/playground/playground.txt /path/to/dokuwiki/data/pages/playground/</pre> <p> Example: Restore all pages in <a href="/namespaces" class="wikilink1" title="namespaces" data-wiki-id="namespaces">namespace</a> “wiki” every 30 min: </p> <pre class="code">0,30 * * * * cp -rf /path/to/savedwiki/data/pages/wiki/ /path/to/dokuwiki/data/pages/wiki/</pre> </div> <div class="secedit editbutton_section editbutton_6"><form class="button btn_secedit" method="post" action="/tips:maintenance"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1696962513" /><input type="hidden" name="summary" value="[Keeping Playground Clean] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="keeping_playground_clean" /><input type="hidden" name="codeblockOffset" value="3" /><input type="hidden" name="range" value="7165-7700" /><button type="submit" title="Keeping Playground Clean">Edit</button></div></form></div> <h3 class="sectionedit7" id="problems_with_captcha_plugin">Problems with CAPTCHA plugin</h3> <div class="level3"> <p> Using the CAPTCHA plugin and the recommended <a href="/tips:maintenance#keeping_playground_clean" class="wikilink1" title="tips:maintenance" data-wiki-id="tips:maintenance">maintenance method</a> to keep the playground clean, can result in the effect of being unable to edit the playground. </p> <p> When this occurs, the problem can be easily resolved by removing the related playground files in the meta folder with the next cronjob. </p> <p> Example: Deletes Playground metafiles every 30 min: </p> <pre class="code">0,30 * * * * rm -f /path/to/dokuwiki/data/meta/playground/playground.*</pre> </div> <div class="secedit editbutton_section editbutton_7"><form class="button btn_secedit" method="post" action="/tips:maintenance"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1696962513" /><input type="hidden" name="summary" value="[Problems with CAPTCHA plugin] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="problems_with_captcha_plugin" /><input type="hidden" name="codeblockOffset" value="3" /><input type="hidden" name="range" value="7701-8209" /><button type="submit" title="Problems with CAPTCHA plugin">Edit</button></div></form></div> <h2 class="sectionedit8" id="when_cronjob_is_not_available">When cronjob is not available</h2> <div class="level2"> <p> When your hosting doesn't allow to use cronjobs, consider using the <a href="/plugin:cronojob" class="wikilink1" title="plugin:cronojob" data-wiki-id="plugin:cronojob">cronojob</a> plugin instead. </p> </div> <div class="secedit editbutton_section editbutton_8"><form class="button btn_secedit" method="post" action="/tips:maintenance"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1696962513" /><input type="hidden" name="summary" value="[When cronjob is not available] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="when_cronjob_is_not_available" /><input type="hidden" name="codeblockOffset" value="3" /><input type="hidden" name="range" value="8210-8366" /><button type="submit" title="When cronjob is not available">Edit</button></div></form></div> <h2 class="sectionedit9" id="discussion">Discussion</h2> <div class="level2"> <p> Could you please provide PHP versions of these scripts to use with the cronojob plugin? </p> <hr /> <blockquote><div class="no"> Regarding the above cleanup script which uses file modification time (mtime), wouldn't it be safer to use the timestamp in the filename to determine if a file in the attic should be deleted or not?</div></blockquote> <p> On the one hand, I'd say it could be done but it's of course trickier to set up. For many installations it will be fine to use mtime. On the other hand, some might want to make sure they clean up old files no matter what (e.g. files left after a crash or critical PHP error). </p> <hr /> <p> Could someone add the appropriate line for <a href="https://forum.dokuwiki.org/post/22265" class="urlextern" title="https://forum.dokuwiki.org/post/22265">cache maintenance</a> to the Windows waRmZip script? </p> <hr /> <p> Does the <a href="/plugin:cleanup" class="wikilink1" title="plugin:cleanup" data-wiki-id="plugin:cleanup">cleanup Plugin</a> handle all the above tasks? Would it be recommended over running these scripts? </p> <hr /> <p> This is example of php script to clean old cache files. useful when .sh is not available to run. </p> <dl class="file"> <dt><a href="/_export/code/tips:maintenance?codeblock=3" title="Download Snippet" class="mediafile mf_php">cleanup.php</a></dt> <dd><pre class="code file php"><span class="kw2"><?php</span> <span class="coMULTI">/* * mrlemonade ~ */</span> <span class="kw2">function</span> getFilesFromDir<span class="br0">(</span><span class="re0">$dir</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$files</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$handle</span> <span class="sy0">=</span> <a href="http://www.php.net/opendir"><span class="kw3">opendir</span></a><span class="br0">(</span><span class="re0">$dir</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">while</span> <span class="br0">(</span><span class="kw4">false</span> <span class="sy0">!==</span> <span class="br0">(</span><span class="re0">$file</span> <span class="sy0">=</span> <a href="http://www.php.net/readdir"><span class="kw3">readdir</span></a><span class="br0">(</span><span class="re0">$handle</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$file</span> <span class="sy0">!=</span> <span class="st0">"."</span> <span class="sy0">&&</span> <span class="re0">$file</span> <span class="sy0">!=</span> <span class="st0">".."</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">if</span><span class="br0">(</span><a href="http://www.php.net/is_dir"><span class="kw3">is_dir</span></a><span class="br0">(</span><span class="re0">$dir</span><span class="sy0">.</span><span class="st_h">'/'</span><span class="sy0">.</span><span class="re0">$file</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$dir2</span> <span class="sy0">=</span> <span class="re0">$dir</span><span class="sy0">.</span><span class="st_h">'/'</span><span class="sy0">.</span><span class="re0">$file</span><span class="sy0">;</span> <span class="re0">$files</span><span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> getFilesFromDir<span class="br0">(</span><span class="re0">$dir2</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="re0">$files</span><span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="re0">$dir</span><span class="sy0">.</span><span class="st_h">'/'</span><span class="sy0">.</span><span class="re0">$file</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="br0">}</span> <a href="http://www.php.net/closedir"><span class="kw3">closedir</span></a><span class="br0">(</span><span class="re0">$handle</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">return</span> array_flat<span class="br0">(</span><span class="re0">$files</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw2">function</span> array_flat<span class="br0">(</span><span class="re0">$array</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">foreach</span><span class="br0">(</span><span class="re0">$array</span> <span class="kw1">as</span> <span class="re0">$a</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">if</span><span class="br0">(</span><a href="http://www.php.net/is_array"><span class="kw3">is_array</span></a><span class="br0">(</span><span class="re0">$a</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$tmp</span> <span class="sy0">=</span> <a href="http://www.php.net/array_merge"><span class="kw3">array_merge</span></a><span class="br0">(</span><span class="re0">$tmp</span><span class="sy0">,</span> array_flat<span class="br0">(</span><span class="re0">$a</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="re0">$tmp</span><span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="re0">$a</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">return</span> <span class="re0">$tmp</span><span class="sy0">;</span> <span class="br0">}</span> <span class="co1">// Define the folder to clean</span> <span class="re0">$captchaFolder</span> <span class="sy0">=</span> <span class="st_h">'data/cache'</span><span class="sy0">;</span> <span class="co1">// Here you can define after how many</span> <span class="co1">// days the files should get deleted</span> <span class="re0">$expire_time</span> <span class="sy0">=</span> <span class="nu0">5</span><span class="sy0">;</span> <span class="co1">// Find all files of the given file type</span> <span class="kw1">foreach</span> <span class="br0">(</span>getFilesFromDir<span class="br0">(</span><span class="re0">$captchaFolder</span><span class="br0">)</span> <span class="kw1">as</span> <span class="re0">$Filename</span><span class="br0">)</span> <span class="br0">{</span> <span class="co1">// Read file creation time</span> <span class="re0">$FileCreationTime</span> <span class="sy0">=</span> <a href="http://www.php.net/filectime"><span class="kw3">filectime</span></a><span class="br0">(</span><span class="re0">$Filename</span><span class="br0">)</span><span class="sy0">;</span> <span class="co1">// Calculate file age in seconds</span> <span class="re0">$FileAge</span> <span class="sy0">=</span> <a href="http://www.php.net/time"><span class="kw3">time</span></a><span class="br0">(</span><span class="br0">)</span> <span class="sy0">-</span> <span class="re0">$FileCreationTime</span><span class="sy0">;</span> <span class="co1">// Is the file older than the given time span?</span> <span class="kw1">if</span> <span class="br0">(</span><span class="re0">$FileAge</span> <span class="sy0">></span> <span class="br0">(</span><span class="re0">$expire_time</span><span class="sy0">*</span><span class="nu0">60</span><span class="sy0">*</span><span class="nu0">60</span><span class="sy0">*</span><span class="nu0">24</span> <span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span> <span class="co1">// Now do something with the olders files...</span> <span class="kw1">print</span> <span class="st0">"The file <span class="es4">$Filename</span> is older than <span class="es4">$expire_time</span> days <span class="es1">\n</span>"</span><span class="sy0">;</span> <span class="co1">// For example deleting files:</span> <span class="co1">// unlink($Filename);</span> <span class="br0">}</span> <span class="br0">}</span> <span class="kw1">echo</span> <span class="st_h">'ran'</span><span class="sy0">;</span> <span class="sy1">?></span></pre> </dd></dl> <p> use this at your own risk. — <a href="https://forum.dokuwiki.org/u/goldseed" class="interwiki iw_user" title="https://forum.dokuwiki.org/u/goldseed">S.C. Yoo</a> <em>2012/02/10 12:49</em> </p> <hr /> <p> Cheers, I'd like to add that it is a good idea to clean up orphaned meta data, don't you think? I do the following (in an R script): </p> <ol> <li class="level1"><div class="li">list all files in the pages directory recursively</div> </li> <li class="level1"><div class="li">add a column 'pagename' to this list that countains the file name again but without the base directory</div> </li> <li class="level1"><div class="li">in pagename exchange '/' (or '\') with ':' and remove the file extension</div> </li> <li class="level1"><div class="li">do the same for the meta directory + exclude some additional files</div> </li> <li class="level1"><div class="li">remove all entries from the meta-list from which the page name is in the pages-list</div> </li> <li class="level1"><div class="li">delete all files left in the meta list</div> </li> </ol> <p> Of course one could add a time constraint on it so that you don't use metadata immediately. </p> <p> Clemo <em>2016/09/23 sometime</em> </p> </div> <div class="secedit editbutton_section editbutton_9"><form class="button btn_secedit" method="post" action="/tips:maintenance"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1696962513" /><input type="hidden" name="summary" value="[Discussion] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="discussion" /><input type="hidden" name="codeblockOffset" value="3" /><input type="hidden" name="range" value="8367-" /><button type="submit" title="Discussion">Edit</button></div></form></div><div class="footnotes"> <div class="fn"><sup><a href="#fnt__1" id="fn__1" class="fn_bot">1)</a></sup> <div class="content">For a discussion of cache maintenance see also the <a href="https://forum.dokuwiki.org/post/22265" class="urlextern" title="https://forum.dokuwiki.org/post/22265">forum discussion</a>.</div></div> </div> <!-- wikipage stop --> </div> <div class="docInfo"><bdi>tips/maintenance.txt</bdi> · Last modified: <time datetime="2023-10-10T20:28:33+0200">2023-10-10 20:28</time> by <bdi>staze</bdi></div> <hr class="a11y" /> </div></main><!-- /content --> <!-- PAGE ACTIONS --> <nav id="dokuwiki__pagetools" aria-labelledby="dokuwiki__pagetools__heading"> <h3 class="a11y" id="dokuwiki__pagetools__heading">Page Tools</h3> <div class="tools"> <ul> <li class="edit"><a href="/tips:maintenance?do=edit" title="Edit this page [e]" rel="nofollow" accesskey="e"><span>Edit this page</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg></a></li><li class="revs"><a href="/tips:maintenance?do=revisions" title="Old revisions [o]" rel="nofollow" accesskey="o"><span>Old revisions</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M11 7v5.11l4.71 2.79.79-1.28-4-2.37V7m0-5C8.97 2 5.91 3.92 4.27 6.77L2 4.5V11h6.5L5.75 8.25C6.96 5.73 9.5 4 12.5 4a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1-7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5A9.5 9.5 0 0 0 12.5 2z"/></svg></a></li><li class="backlink"><a href="/tips:maintenance?do=backlink" title="Backlinks" rel="nofollow"><span>Backlinks</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10.59 13.41c.41.39.41 1.03 0 1.42-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0 5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.982 2.982 0 0 0 0-4.24 2.982 2.982 0 0 0-4.24 0l-3.53 3.53a2.982 2.982 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0 5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.982 2.982 0 0 0 0 4.24 2.982 2.982 0 0 0 4.24 0l3.53-3.53a2.982 2.982 0 0 0 0-4.24.973.973 0 0 1 0-1.42z"/></svg></a></li><li class="top"><a href="#dokuwiki__top" title="Back to top [t]" rel="nofollow" accesskey="t"><span>Back to top</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"/></svg></a></li> </ul> </div> </nav> </div><!-- /wrapper --> <!-- ********** FOOTER ********** --> <footer id="dokuwiki__footer"><div class="pad"> <div class="license">Except where otherwise noted, content on this wiki is licensed under the following license: <bdi><a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en" rel="license" class="urlextern">CC Attribution-Share Alike 4.0 International</a></bdi></div> <div class="buttons"> <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en" rel="license"><img src="/lib/images/license/button/cc-by-sa.png" alt="CC Attribution-Share Alike 4.0 International" /></a> <a href="https://www.dokuwiki.org/donate" title="Donate" ><img src="/lib/tpl/dokuwiki/images/button-donate.gif" width="80" height="15" alt="Donate" /></a> <a href="https://php.net" title="Powered by PHP" ><img src="/lib/tpl/dokuwiki/images/button-php.gif" width="80" height="15" alt="Powered by PHP" /></a> <a href="//validator.w3.org/check/referer" title="Valid HTML5" ><img src="/lib/tpl/dokuwiki/images/button-html5.png" width="80" height="15" alt="Valid HTML5" /></a> <a href="//jigsaw.w3.org/css-validator/check/referer?profile=css3" title="Valid CSS" ><img src="/lib/tpl/dokuwiki/images/button-css.png" width="80" height="15" alt="Valid CSS" /></a> <a href="https://dokuwiki.org/" title="Driven by DokuWiki" ><img src="/lib/tpl/dokuwiki/images/button-dw.png" width="80" height="15" alt="Driven by DokuWiki" /></a> </div> <div style="margin-top: 2em; font-size:90%" class="dokuwiki"><div style="float:right"><a href="http://www.splitbrain.org/personal#imprint" style="float:right; text-decoration: none; color:#333">Imprint</a></div></div><!-- Include for DokuWiki site wide top bar --> <style type="text/css"> @media screen { body { padding-top: 30px; } #global__header { position: absolute; top: 0; left: 0; text-align: left; vertical-align: middle; line-height: 1.5; background-color: #333; box-shadow: 0 0 8px rgba(0,0,0,0.5); width: 100%; margin: 0; padding: 5px 20px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; white-space: nowrap; overflow: hidden; } #global__header h2 { position: absolute; left: -99999em; top: 0; overflow: hidden; display: inline; } #global__header ul, #global__header li { margin: 0; padding: 0; list-style: none; display: inline; line-height: 1.5; } #global__header a { color: #bbb; text-decoration: none; margin-right: 20px; font-size: 14px; font-weight: normal; } #global__header a:hover, #global__header a:active, #global__header a:focus { color: #fff; text-decoration: underline; } #global__header form { float: right; margin: 0 0 0 20px; } #global__header input { background-color: #333; background-image: none; border: 1px solid #bbb; color: #fff; box-shadow: none; border-radius: 2px; margin: 0; line-height: normal; padding: 1px 0 1px 0; height: auto; } #global__header input.button { border: none; color: #bbb; } #global__header input.button:hover, #global__header input.button:active, #global__header input.button:focus { color: #fff; text-decoration: underline; } } /* /@media */ @media only screen and (min-width: 601px) { /* changes specific for www.dokuwiki.org */ #dokuwiki__header { padding-top: 3em; } #dokuwiki__usertools { top: 3em; } /* changes specific for bugs.dokuwiki.org */ div#container div#showtask { top: 40px; } } /* /@media */ @media only screen and (max-width: 600px) { body { padding-top: 0; } #global__header { position: static; white-space: normal; overflow: auto; } #global__header form { float: none; display: block; margin: 0 0 .4em; } } /* /@media */ @media print { #global__header { display: none; } } /* /@media */ </style> <div id="global__header"> <h2>Global DokuWiki Links</h2> <form method="get" action="https://search.dokuwiki.org/" target="_top"> <input type="text" name="q" title="Search all DokuWiki sites at once" class="input" /> <input type="submit" title="Search all DokuWiki sites at once" value="Search" class="button" /> </form> <ul> <li><a href="https://download.dokuwiki.org" title="Download the latest release" target="_top">Download</a></li> <li><a href="https://www.dokuwiki.org" title="Read the DokuWiki documentation" target="_top">Wiki</a></li> <li><a href="https://forum.dokuwiki.org" title="Ask questions in the DokuWiki forum" target="_top">Forum</a></li> <li><a href="https://irc.dokuwiki.org" title="Check IRC chat logs or join the chat" target="_top">IRC</a></li> <li><a href="https://github.com/splitbrain/dokuwiki/issues" title="Report and track bugs" target="_top">Bugs</a></li> <li><a href="https://translate.dokuwiki.org/" title="Help translating the DokuWiki interface" target="_top">Translate</a></li> <li><a href="https://github.com/splitbrain/dokuwiki" title="Access the most recent git commits" target="_top">Git</a></li> <li><a href="https://xref.dokuwiki.org/reference/dokuwiki/" title="Cross-Reference of the DokuWiki source code" target="_top">XRef</a></li> <li><a href="https://codesearch.dokuwiki.org/" title="Search through the sources of DokuWiki, plugins and templates" target="_top">Code Search</a></li> </ul> </div> <!-- end of DokuWiki top bar include --> </div></footer><!-- /footer --> </div></div><!-- /site --> <div class="no"><img src="/lib/exe/taskrunner.php?id=tips%3Amaintenance&1742655302" width="2" height="1" alt="" /></div> <div id="screen__mode" class="no"></div></body> </html>