Make transcluded special pages not disable cache in miser mode.
Previously {{Special:Foo}} would cause parser cache to be disabled,
now have a method in SpecialPage to control this behaviour and set
arbitrary caching times.
Note: This does not affect caching of direct views to the special page
The new default is now disabling cache if not in miser mode,
otherwise setting to 1 hour, except for Special:Recentchanges
and Special:Newpages which set to 5 minutes. These values are
possibly really low, but for now I think best to be close to the
old behaviour. We had 0 caching for these things for years, and
afaik it hasn't caused any big issues. Part of me wonders if
Special:Recentchanges should stay at 0, but that sounds crazy.
This change also causes transcluded special pages to not be
"per-user" if they are being cached (Specificly $wgUser et al
become 127.0.0.1).
Bug: 60561
Change-Id: Id9ce987adeaa69d886eb1c5cd74c01072583e84d
This commit is contained in:
parent
879ebfb18a
commit
7730dee63b
4 changed files with 58 additions and 3 deletions
|
|
@ -3125,6 +3125,7 @@ class Parser {
|
|||
&& $this->mOptions->getAllowSpecialInclusion()
|
||||
&& $this->ot['html']
|
||||
) {
|
||||
$specialPage = SpecialPageFactory::getPage( $title->getDBkey() );
|
||||
// Pass the template arguments as URL parameters.
|
||||
// "uselang" will have no effect since the Language object
|
||||
// is forced to the one defined in ParserOptions.
|
||||
|
|
@ -3143,7 +3144,12 @@ class Parser {
|
|||
$context = new RequestContext;
|
||||
$context->setTitle( $title );
|
||||
$context->setRequest( new FauxRequest( $pageArgs ) );
|
||||
$context->setUser( $this->getUser() );
|
||||
if ( $specialPage && $specialPage->maxIncludeCacheTime() === 0 ) {
|
||||
$context->setUser( $this->getUser() );
|
||||
} else {
|
||||
// If this page is cached, then we better not be per user.
|
||||
$context->setUser( User::newFromName( '127.0.0.1', false ) );
|
||||
}
|
||||
$context->setLanguage( $this->mOptions->getUserLangObj() );
|
||||
$ret = SpecialPageFactory::capturePath( $title, $context );
|
||||
if ( $ret ) {
|
||||
|
|
@ -3151,8 +3157,9 @@ class Parser {
|
|||
$this->mOutput->addOutputPageMetadata( $context->getOutput() );
|
||||
$found = true;
|
||||
$isHTML = true;
|
||||
// Severely reduce cache time to keep content dynamic
|
||||
$this->mOutput->updateCacheExpiry( 30 );
|
||||
if ( $specialPage && $specialPage->maxIncludeCacheTime() !== false ) {
|
||||
$this->mOutput->updateCacheExpiry( $specialPage->maxIncludeCacheTime() );
|
||||
}
|
||||
}
|
||||
} elseif ( MWNamespace::isNonincludable( $title->getNamespace() ) ) {
|
||||
$found = false; # access denied
|
||||
|
|
|
|||
|
|
@ -175,6 +175,25 @@ class SpecialPage {
|
|||
return $this->mIncludable;
|
||||
}
|
||||
|
||||
/**
|
||||
* How long to cache page when it is being included.
|
||||
*
|
||||
* @note If cache time is not 0, then the current user becomes an anon
|
||||
* if you want to do any per-user customizations, than this method
|
||||
* must be overriden to return 0.
|
||||
* @since 1.26
|
||||
* @return int Time in seconds, 0 to disable caching altogether,
|
||||
* false to use the parent page's cache settings
|
||||
*/
|
||||
public function maxIncludeCacheTime() {
|
||||
global $wgMiserMode;
|
||||
if ( !$wgMiserMode ) {
|
||||
return 0;
|
||||
} else {
|
||||
return 60*60;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the special page is being evaluated via transclusion
|
||||
* @param bool $x
|
||||
|
|
|
|||
|
|
@ -478,4 +478,18 @@ class SpecialNewpages extends IncludableSpecialPage {
|
|||
protected function getGroupName() {
|
||||
return 'changes';
|
||||
}
|
||||
|
||||
/**
|
||||
* How long to cache page when it is being included.
|
||||
*
|
||||
* @return int Time in seconds, 0 to disable caching altogether
|
||||
*/
|
||||
public function maxIncludeCacheTime() {
|
||||
global $wgMiserMode;
|
||||
if ( !$wgMiserMode ) {
|
||||
return 0;
|
||||
} else {
|
||||
return 60*5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -794,4 +794,19 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
|
|||
public function isIncludable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* How long to cache page when it is being included.
|
||||
*
|
||||
* @return int|bool Time in seconds, 0 to disable caching altogether
|
||||
*/
|
||||
public function maxIncludeCacheTime() {
|
||||
global $wgMiserMode;
|
||||
if ( !$wgMiserMode ) {
|
||||
return 0;
|
||||
} else {
|
||||
return 60*5;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue