123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- MediaWiki has optional support for memcached, a "high-performance,
- distributed memory object caching system". For general information
- on it, see: http://www.danga.com/memcached/
- Memcached is likely more trouble than a small site will need, but
- for a larger site with heavy load, like Wikipedia, it should help
- lighten the load on the database servers by caching data and objects
- in memory.
- == Installation ==
- Packages are available for Fedora, Debian, Ubuntu and probably other
- Linux distributions. If there's no package available for your
- distribution, you can compile it from source.
- == Compilation ==
- * PHP must be compiled with --enable-sockets
- * libevent: http://www.monkey.org/~provos/libevent/
- (as of 2003-08-11, 0.7a is current)
- * optionally, epoll-rt patch for Linux kernel:
- http://www.xmailserver.org/linux-patches/nio-improve.html
- * memcached: http://www.danga.com/memcached/download.bml
- (as of this writing, 1.1.9 is current)
- Memcached and libevent are under BSD-style licenses.
- The server should run on Linux and other Unix-like systems... you
- can run multiple servers on one machine or on multiple machines on
- a network; storage can be distributed across multiple servers, and
- multiple web servers can use the same cache cluster.
- ********************* W A R N I N G ! ! ! ! ! ***********************
- Memcached has no security or authentication. Please ensure that your
- server is appropriately firewalled, and that the port(s) used for
- memcached servers are not publicly accessible. Otherwise, anyone on
- the internet can put data into and read data from your cache.
- An attacker familiar with MediaWiki internals could use this to steal
- passwords and email addresses, or to make themselves a sysop and
- install malicious javascript on the site. There may be other types
- of vulnerability, no audit has been done -- so be safe and keep it
- behind a firewall.
- ********************* W A R N I N G ! ! ! ! ! ***********************
- == Setup ==
- If you installed memcached using a distro, the daemon should be started
- automatically using /etc/init.d/memcached.
- To start the daemon manually, use something like:
- memcached -d -l 127.0.0.1 -p 11211 -m 64
- (to run in daemon mode, accessible only via loopback interface,
- on port 11211, using up to 64MB of memory)
- In your LocalSettings.php file, set:
- $wgMainCacheType = CACHE_MEMCACHED;
- $wgMemCachedServers = [ "127.0.0.1:11211" ];
- The wiki should then use memcached to cache various data. To use
- multiple servers (physically separate boxes or multiple caches
- on one machine on a large-memory x86 box), just add more items
- to the array. To increase the weight of a server (say, because
- it has twice the memory of the others and you want to spread
- usage evenly), make its entry a subarray:
- $wgMemCachedServers = [
- "127.0.0.1:11211", # one gig on this box
- [ "192.168.0.1:11211", 2 ] # two gigs on the other box
- ];
- == PHP client for memcached ==
- MediaWiki uses a fork of Ryan T. Dean's pure-PHP memcached client.
- It also supports the PECL PHP extension for memcached.
- MediaWiki uses the ObjectCache class to retrieve instances of
- BagOStuff by purpose, controlled by the following variables:
- * $wgMainCacheType
- * $wgParserCacheType
- * $wgMessageCacheType
- If you set one of these to CACHE_NONE, MediaWiki still creates a
- BagOStuff object, but calls it to it are no-ops. If the cache daemon
- can't be contacted, it should also disable itself fairly smoothly.
- == Keys used ==
- (incomplete, out of date)
- Date Formatter:
- key: $wgDBname:dateformatter
- ex: wikidb:dateformatter
- stores: a single instance of the DateFormatter class
- cleared by: nothing
- expiry: one hour
- Difference Engine:
- key: $wgDBname:diff:version:{MW_DIFF_VERSION}:oldid:$old:newid:$new
- ex: wikidb:diff:version:1.11a:oldid:1:newid:2
- stores: body of a difference
- cleared by: nothing
- expiry: one week
- Interwiki:
- key: $wgDBname:interwiki:$prefix
- ex: wikidb:interwiki:w
- stores: object from the interwiki table of the database
- expiry: $wgInterwikiExpiry
- cleared by: nothing
- Lag time of the databases:
- key: $wgDBname:lag_times
- ex: wikidb:lag_times
- stores: array mapping the database id to its lag time
- expiry: 5 secondes
- cleared by: nothing
- Localisation:
- key: $wgDBname:localisation:$lang
- ex: wikidb:localisation:de
- stores: array of localisation settings
- set in: Language::loadLocalisation()
- expiry: none
- cleared by: Language::loadLocalisation()
- Message Cache:
- See MessageCache.php.
- Newtalk:
- key: $wgDBname:newtalk:ip:$ip
- ex: wikidb:newtalk:ip:123.45.67.89
- stores: integer, 0 or 1
- set in: User::loadFromDatabase()
- cleared by: User::saveSettings() # ?
- expiry: 30 minutes
- Parser Cache:
- access: ParserCache
- backend: $wgParserCacheType
- key: $wgDBname:pcache:idhash:$pageid-$renderkey!$hash
- $pageid: id of the page
- $renderkey: 1 if action=render, 0 otherwise
- $hash: hash of user options applied to the page, see ParserOptions::optionsHash()
- ex: wikidb:pcache:idhash:1-0!1!0!!en!2
- stores: ParserOutput object
- modified by: WikiPage::doEditUpdates() or PoolWorkArticleView::doWork()
- expiry: $wgParserCacheExpireTime or less if it contains short lived functions
- key: $wgDBname:pcache:idoptions:$pageid
- stores: CacheTime object with an additional list of used options for the hash,
- serves as ParserCache pointer.
- modified by: ParserCache::save()
- expiry: The same as the ParserCache entry it points to.
- Ping limiter:
- controlled by: $wgRateLimits
- key: $wgDBname:limiter:action:$action:ip:$ip,
- $wgDBname:limiter:action:$action:user:$id,
- mediawiki:limiter:action:$action:ip:$ip and
- mediawiki:limiter:action:$action:subnet:$sub
- ex: wikidb:limiter:action:edit:ip:123.45.67.89,
- wikidb:limiter:action:edit:user:1012
- mediawiki:limiter:action:edit:ip:123.45.67.89 and
- mediawiki:limiter:action:$action:subnet:123.45.67
- stores: number of action made by user/ip/subnet
- cleared by: nothing
- expiry: expiry set for the action and group in $wgRateLimits
- Proxy Check: (deprecated)
- key: $wgDBname:proxy:ip:$ip
- ex: wikidb:proxy:ip:123.45.67.89
- stores: 1 if the ip is a proxy
- cleared by: nothing
- expiry: $wgProxyMemcExpiry
- Revision text:
- key: $wgDBname:revisiontext:textid:$id
- ex: wikidb:revisiontext:textid:1012
- stores: text of a revision
- cleared by: nothing
- expiry: $wgRevisionCacheExpiry
- Sessions:
- controlled by: $wgSessionsInObjectCache
- key: $wgBDname:session:$id
- ex: wikidb:session:38d7c5b8d3bfc51egf40c69bc40f8be3
- stores: $SESSION, useful when using a multi-sever wiki
- expiry: one hour
- cleared by: session_destroy()
- Sidebar:
- access: WANObjectCache
- controlled by: $wgEnableSidebarCache
- key: $wgDBname:sidebar
- ex: wikidb:sidebar
- stores: the html output of the sidebar
- expiry: $wgSidebarCacheExpiry
- cleared by: MessageCache::replace()
- Special:Allpages:
- key: $wgDBname:allpages:ns:$ns
- ex: wikidb:allpages:ns:0
- stores: array of pages in a namespace
- expiry: one hour
- cleared by: nothing
- Special:Recentchanges (feed):
- backend: $wgMessageCacheType
- key: $wgDBname:rcfeed:$format:$limit:$hideminor:$target and
- rcfeed:$format:timestamp
- ex: wikidb:rcfeed:rss:50:: and rcfeed:rss:timestamp
- stores: xml output of feed
- expiry: one day
- clear by: maintenance/rebuildrecentchanges.php script, or
- calling Special:Recentchanges?action=purge&feed=rss,
- Special:Recentchanges?action=purge&feed=atom,
- but note need $wgGroupPermissions[...]['purge'] permission.
- ... more to come ...
|