Fix ApiBase::getErrorFromStatus() and ApiMessages
[mediawiki.git] / includes / cache / ResourceFileCache.php
blob326d0659af714e8c87e61a92161331846a4031f0
1 <?php
2 /**
3 * ResourceLoader request result caching in the file system.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * http://www.gnu.org/copyleft/gpl.html
20 * @file
21 * @ingroup Cache
24 /**
25 * ResourceLoader request result caching in the file system.
27 * @ingroup Cache
29 class ResourceFileCache extends FileCacheBase {
30 protected $mCacheWorthy;
32 /* @todo configurable? */
33 const MISS_THRESHOLD = 360; // 6/min * 60 min
35 /**
36 * Construct an ResourceFileCache from a context
37 * @param ResourceLoaderContext $context
38 * @return ResourceFileCache
40 public static function newFromContext( ResourceLoaderContext $context ) {
41 $cache = new self();
43 if ( $context->getImage() ) {
44 $cache->mType = 'image';
45 } elseif ( $context->getOnly() === 'styles' ) {
46 $cache->mType = 'css';
47 } else {
48 $cache->mType = 'js';
50 $modules = array_unique( $context->getModules() ); // remove duplicates
51 sort( $modules ); // normalize the order (permutation => combination)
52 $cache->mKey = sha1( $context->getHash() . implode( '|', $modules ) );
53 if ( count( $modules ) == 1 ) {
54 $cache->mCacheWorthy = true; // won't take up much space
57 return $cache;
60 /**
61 * Check if an RL request can be cached.
62 * Caller is responsible for checking if any modules are private.
63 * @param ResourceLoaderContext $context
64 * @return bool
66 public static function useFileCache( ResourceLoaderContext $context ) {
67 global $wgUseFileCache, $wgDefaultSkin, $wgLanguageCode;
68 if ( !$wgUseFileCache ) {
69 return false;
71 // Get all query values
72 $queryVals = $context->getRequest()->getValues();
73 foreach ( $queryVals as $query => $val ) {
74 if ( in_array( $query, [ 'modules', 'image', 'variant', 'version', '*' ] ) ) {
75 // Use file cache regardless of the value of this parameter
76 continue; // note: &* added as IE fix
77 } elseif ( $query === 'skin' && $val === $wgDefaultSkin ) {
78 continue;
79 } elseif ( $query === 'lang' && $val === $wgLanguageCode ) {
80 continue;
81 } elseif ( $query === 'only' && in_array( $val, [ 'styles', 'scripts' ] ) ) {
82 continue;
83 } elseif ( $query === 'debug' && $val === 'false' ) {
84 continue;
85 } elseif ( $query === 'format' && $val === 'rasterized' ) {
86 continue;
89 return false;
92 return true; // cacheable
95 /**
96 * Get the base file cache directory
97 * @return string
99 protected function cacheDirectory() {
100 return $this->baseCacheDirectory() . '/resources';
104 * Item has many recent cache misses
105 * @return bool
107 public function isCacheWorthy() {
108 if ( $this->mCacheWorthy === null ) {
109 $this->mCacheWorthy = (
110 $this->isCached() || // even stale cache indicates it was cache worthy
111 $this->getMissesRecent() >= self::MISS_THRESHOLD // many misses
115 return $this->mCacheWorthy;