1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
|
<?php
/**
* Parser cache specific expiry check.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
* @ingroup Parser
*/
/**
* Parser cache specific expiry check.
*
* @ingroup Parser
*/
class CacheTime {
/**
* @var string[] ParserOptions which have been taken into account to produce output.
*/
public $mUsedOptions;
/**
* @var string|null Compatibility check
*/
public $mVersion = Parser::VERSION;
/**
* @var string|int TS_MW timestamp when this object was generated, or -1 for not cacheable. Used
* in ParserCache.
*/
public $mCacheTime = '';
/**
* @var int|null Seconds after which the object should expire, use 0 for not cacheable. Used in
* ParserCache.
*/
public $mCacheExpiry = null;
/**
* @var int|null Revision ID that was parsed
*/
public $mCacheRevisionId = null;
/**
* @return string TS_MW timestamp
*/
public function getCacheTime() {
// NOTE: keep support for undocumented used of -1 to mean "not cacheable".
if ( $this->mCacheTime === '' ) {
$this->mCacheTime = MWTimestamp::now();
}
return $this->mCacheTime;
}
/**
* setCacheTime() sets the timestamp expressing when the page has been rendered.
* This does not control expiry, see updateCacheExpiry() for that!
* @param string $t TS_MW timestamp
* @return string
*/
public function setCacheTime( $t ) {
// NOTE: keep support for undocumented used of -1 to mean "not cacheable".
if ( is_string( $t ) && $t !== '-1' ) {
$t = MWTimestamp::convert( TS_MW, $t );
}
return wfSetVar( $this->mCacheTime, $t );
}
/**
* @since 1.23
* @return int|null Revision id, if any was set
*/
public function getCacheRevisionId() {
return $this->mCacheRevisionId;
}
/**
* @since 1.23
* @param int|null $id Revision ID
*/
public function setCacheRevisionId( $id ) {
$this->mCacheRevisionId = $id;
}
/**
* Sets the number of seconds after which this object should expire.
*
* This value is used with the ParserCache.
* If called with a value greater than the value provided at any previous call,
* the new call has no effect. The value returned by getCacheExpiry is smaller
* or equal to the smallest number that was provided as an argument to
* updateCacheExpiry().
*
* Avoid using 0 if at all possible. Consider JavaScript for highly dynamic content.
*
* @param int $seconds
*/
public function updateCacheExpiry( $seconds ) {
$seconds = (int)$seconds;
if ( $this->mCacheExpiry === null || $this->mCacheExpiry > $seconds ) {
$this->mCacheExpiry = $seconds;
}
}
/**
* Returns the number of seconds after which this object should expire.
* This method is used by ParserCache to determine how long the ParserOutput can be cached.
* The timestamp of expiry can be calculated by adding getCacheExpiry() to getCacheTime().
* The value returned by getCacheExpiry is smaller or equal to the smallest number
* that was provided to a call of updateCacheExpiry(), and smaller or equal to the
* value of $wgParserCacheExpireTime.
* @return int
*/
public function getCacheExpiry() {
global $wgParserCacheExpireTime;
// NOTE: keep support for undocumented used of -1 to mean "not cacheable".
if ( $this->mCacheTime !== '' && $this->mCacheTime < 0 ) {
return 0;
}
$expire = $this->mCacheExpiry;
if ( $expire === null ) {
$expire = $wgParserCacheExpireTime;
} else {
$expire = min( $expire, $wgParserCacheExpireTime );
}
if ( $expire <= 0 ) {
return 0; // not cacheable
} else {
return $expire;
}
}
/**
* @return bool
*/
public function isCacheable() {
return $this->getCacheExpiry() > 0;
}
/**
* Return true if this cached output object predates the global or
* per-article cache invalidation timestamps, or if it comes from
* an incompatible older version.
*
* @param string $touched The affected article's last touched timestamp
* @return bool
*/
public function expired( $touched ) {
global $wgCacheEpoch;
$expiry = MWTimestamp::convert( TS_MW, MWTimestamp::time() - $this->getCacheExpiry() );
return !$this->isCacheable() // parser says it's not cacheable
|| $this->getCacheTime() < $touched
|| $this->getCacheTime() <= $wgCacheEpoch
|| $this->getCacheTime() < $expiry // expiry period has passed
|| !isset( $this->mVersion )
|| version_compare( $this->mVersion, Parser::VERSION, "lt" );
}
/**
* Return true if this cached output object is for a different revision of
* the page.
*
* @todo We always return false if $this->getCacheRevisionId() is null;
* this prevents invalidating the whole parser cache when this change is
* deployed. Someday that should probably be changed.
*
* @since 1.23
* @param int $id The affected article's current revision id
* @return bool
*/
public function isDifferentRevision( $id ) {
$cached = $this->getCacheRevisionId();
return $cached !== null && $id !== $cached;
}
}
|