seek() does nothing here
[mediawiki.git] / docs / memcached.txt
blob5cc91109f9a9233fd95e7bea069153d2770ec29f
1 memcached support for MediaWiki:
3 From ca August 2003, MediaWiki has optional support for memcached, a
4 "high-performance, distributed memory object caching system".
5 For general information on it, see: http://www.danga.com/memcached/
7 Memcached is likely more trouble than a small site will need, but
8 for a larger site with heavy load, like Wikipedia, it should help
9 lighten the load on the database servers by caching data and objects
10 in memory.
12 == Requirements ==
14 * PHP must be compiled with --enable-sockets
16 * libevent: http://www.monkey.org/~provos/libevent/
17   (as of 2003-08-11, 0.7a is current)
19 * optionally, epoll-rt patch for Linux kernel:
20   http://www.xmailserver.org/linux-patches/nio-improve.html
22 * memcached: http://www.danga.com/memcached/download.bml
23   (as of this writing, 1.1.9 is current)
24   
25 Memcached and libevent are under BSD-style licenses.
27 The server should run on Linux and other Unix-like systems... you
28 can run multiple servers on one machine or on multiple machines on
29 a network; storage can be distributed across multiple servers, and
30 multiple web servers can use the same cache cluster.
32 ********************* W A R N I N G ! ! ! ! ! ***********************
33 Memcached has no security or authentication. Please ensure that your
34 server is appropriately firewalled, and that the port(s) used for
35 memcached servers are not publicly accessible. Otherwise, anyone on
36 the internet can put data into and read data from your cache.
38 An attacker familiar with MediaWiki internals could use this to give
39 themselves developer access and delete all data from the wiki's
40 database, as well as getting all users' password hashes and e-mail
41 addresses.
42 ********************* W A R N I N G ! ! ! ! ! ***********************
44 == Setup ==
46 If you want to start small, just run one memcached on your web
47 server:
49   memcached -d -l 127.0.0.1 -p 11000 -m 64
51 (to run in daemon mode, accessible only via loopback interface,
52 on port 11000, using up to 64MB of memory)
54 In your LocalSettings.php file, set:
56         $wgMainCacheType = CACHE_MEMCACHED;
57         $wgMemCachedServers = array( "127.0.0.1:11000" );
59 The wiki should then use memcached to cache various data. To use
60 multiple servers (physically separate boxes or multiple caches
61 on one machine on a large-memory x86 box), just add more items
62 to the array. To increase the weight of a server (say, because
63 it has twice the memory of the others and you want to spread
64 usage evenly), make its entry a subarray:
66   $wgMemCachedServers = array(
67     "127.0.0.1:11000", # one gig on this box
68     array("192.168.0.1:11000", 2 ) # two gigs on the other box
69   );
71 == PHP client for memcached ==
73 As of this writing, MediaWiki includes version 1.0.10 of the PHP
74 memcached client by Ryan Gilfether <hotrodder@rocketmail.com>.
75 You'll find some documentation for it in the 'php-memcached'
76 subdirectory under the present one.
78 We intend to track updates, but if you want to check for the lastest
79 released version, see http://www.danga.com/memcached/apis.bml
81 MediaWiki use three object for memcaching:
82 * $wgMemc, controlled by $wgMainCacheType
83 * $parserMemc, controlled by $wgParserCacheType
84 * $messageMemc, controlled by $wgMessageCacheType
85 If you set CACHE_NONE to one of the three control variable, (default
86 value for $wgMainCacheType), MediaWiki still create a MemCacheClient,
87 but requests to it are no-ops and we always fall through to the
88 database. If the cache daemon can't be contacted, it should also
89 disable itself fairly smoothly.
91 By default, $wgMemc is used but when it is $parserMemc or $messageMemc
92 this is mentionned below.
94 == Keys used ==
96 Ajax Search:
97         key: $wgDBname:ajaxsearch:md5( $search )
98         ex: wikidb:ajaxsearch:9565814d5d564fa898dd6111b94fae0b
99         stores: array with the result of research of a given text
100         cleared by: nothing
101         expiry: 30 minutes
103 Date Formatter:
104         key: $wgDBname:dateformatter
105         ex: wikidb:dateformatter
106         stores: a single instance of the DateFormatter class
107         cleared by: nothing
108         expiry: one hour
110 Difference Engine:
111         key: $wgDBname:diff:version:{MW_DIFF_VERSION}:oldid:$old:newid:$new
112         ex: wikidb:diff:version:1.11a:oldid:1:newid:2
113         stores: body of a difference
114         cleared by: nothing
115         expiry: one week
117 Interwiki:
118         key: $wgDBname:interwiki:$prefix
119         ex: wikidb:interwiki:w
120         stores: object from the interwiki table of the database
121         expiry: $wgInterwikiExpiry
122         cleared by: nothing
124 Lag time of the databases:
125         key: $wgDBname:lag_times
126         ex: wikidb:lag_times
127         stores: array mapping the database id to its lag time
128         expriy: 5 secondes
129         cleared by: nothing
131 Localisation:
132         key: $wgDBname:localisation:$lang
133         ex: wikidb:localisation:de
134         stores: array of localisation settings
135         set in: Language::loadLocalisation()
136         expiry: none
137         cleared by: Language::loadLocalisation()
139 Message Cache:
140         stored in: $parserMemc
141         key: $wgDBname:messages, $wgDBname:messages-hash, $wgDBname:messages-status
142         ex: wikidb:messages, wikidb:messages-hash, wikidb:messages-status
143         stores: an array where the keys are DB keys and the values are messages
144         set in: wfMsg(), Article::editUpdates() both call wfLoadAllMessages()
145         expriy: $wgMsgCacheExpiry
146         cleared by: nothing
148 Newtalk:
149         key: $wgDBname:newtalk:ip:$ip
150         ex: wikidb:newtalk:ip:123.45.67.89
151         stores: integer, 0 or 1
152         set in: User::loadFromDatabase()
153         cleared by: User::saveSettings() # ?
154         expiry: 30 minutes
156 Parser Cache:
157         stored in: $parserMemc
158         controlled by: $wgEnableParserCache
159         key: $wgDBname:pcache:idhash:$pageid-$renderkey!$hash$edit
160                 $pageid: id of the page
161                 $renderkey: 1 if action=render, 0 otherwise
162                 $hash: hash of user options, see User::getPageRenderingHash()
163                 $edit: '!edit=0' if the user can't edit the page, '' otherwise
164         ex: wikidb:pcache:idhash:1-0!1!0!!en!2
165         stores: ParserOutput object
166         modified by: Article::editUpdates()
167         expriy: $wgParserCacheExpireTime or one hour if it contains specific magic
168                 words
170 Ping limiter:
171         controlled by: $wgRateLimits
172         key: $wgDBname:limiter:action:$action:ip:$ip,
173                 $wgDBname:limiter:action:$action:user:$id,
174                 mediawiki:limiter:action:$action:ip:$ip and
175                 mediawiki:limiter:action:$action:subnet:$sub
176         ex: wikidb:limiter:action:edit:ip:123.45.67.89,
177                 wikidb:limiter:action:edit:user:1012
178                 mediawiki:limiter:action:edit:ip:123.45.67.89 and
179                 mediawiki:limiter:action:$action:subnet:123.45.67
180         stores: number of action made by user/ip/subnet
181         cleared by: nothing
182         expiry: expiry set for the action and group in $wgRateLimits
185 Proxy Check: (deprecated)
186         key: $wgDBname:proxy:ip:$ip
187         ex: wikidb:proxy:ip:123.45.67.89
188         stores: 1 if the ip is a proxy
189         cleared by: nothing
190         expiry: $wgProxyMemcExpiry
192 Revision text:
193         key: $wgDBname:revisiontext:textid:$id
194         ex: wikidb:revisiontext:textid:1012
195         stores: text of a revision
196         cleared by: nothing
197         expriry: $wgRevisionCacheExpiry
199 Sessions:
200         controlled by: $wgSessionsInMemcached
201         key: $wgBDname:session:$id
202         ex: wikidb:session:38d7c5b8d3bfc51egf40c69bc40f8be3
203         stores: $SESSION, useful when using a multi-sever wiki
204         expriy: one hour
205         cleared by: session_destroy()
207 Sidebar:
208         stored in: $parserMemc
209         controlled by: $wgEnableSidebarCache
210         key: $wgDBname:sidebar
211         ex: wikidb:sidebar
212         stores: the html output of the sidebar
213         expriy: $wgSidebarCacheExpiry
214         cleared by: MessageCache::replace()
216 Special:Allpages:
217         key: $wgDBname:allpages:ns:$ns
218         ex: wikidb:allpages:ns:0
219         stores: array of pages in a namespace
220         expiry: one hour
221         cleared by: nothing
223 Special:Recentchanges (feed):
224         stored in: $messageMemc
225         key: $wgDBname:rcfeed:$format:limit:$imit:minor:$hideminor and
226                 rcfeed:$format:timestamp
227         ex: wikidb:rcfeed:rss:limit:50:minor:0 and rcfeed:rss:timestamp
228         stores: xml output of feed
229         expiry: one day
230         clear by: calling Special:Recentchanges?action=purge
232 Statistics:
233         controlled by: $wgStatsMethod
234         key: $wgDBname:stats:$key
235         ex: wikibd:stats:request_with_session
236         stores: counter for statistics (see maintenance/stats.php script)
237         expiry: none (?)
238         cleared by: maintenance/clear_stats.php script
240 User:
241         key: $wgDBname:user:id:$sId
242         ex: wikidb:user:id:51
243         stores: instance of class User
244         set in: User::saveToCache()
245         cleared by: User::saveSettings(), User::clearSharedCache()
246         
247 ... more to come ...