$this->setCdnMaxage( $this->mCdnMaxage );
}
+ /**
+ * Get TTL in [$minTTL,$maxTTL] in pass it to lowerCdnMaxage()
+ *
+ * This sets and returns $minTTL if $mtime is false or null. Otherwise,
+ * the TTL is higher the older the $mtime timestamp is. Essentially, the
+ * TTL is 90% of the age of the object, subject to the min and max.
+ *
+ * @param string|integer|float|bool|null $mtime Last-Modified timestamp
+ * @param integer $minTTL Mimimum TTL in seconds [default: 1 minute]
+ * @param integer $maxTTL Maximum TTL in seconds [default: $wgSquidMaxage]
+ * @return integer TTL in seconds
+ * @since 1.28
+ */
+ public function adaptCdnTTL( $mtime, $minTTL = 0, $maxTTL = 0 ) {
+ $minTTL = $minTTL ?: IExpiringStore::TTL_MINUTE;
+ $maxTTL = $maxTTL ?: $this->getConfig()->get( 'SquidMaxage' );
+
+ if ( $mtime === null || $mtime === false ) {
+ return $minTTL; // entity does not exist
+ }
+
+ $age = time() - wfTimestamp( TS_UNIX, $mtime );
+ $adaptiveTTL = max( .9 * $age, $minTTL );
+ $adaptiveTTL = min( $adaptiveTTL, $maxTTL );
+
+ $this->lowerCdnMaxage( (int)$adaptiveTTL );
+
+ return $adaptiveTTL;
+ }
+
/**
* Use enableClientCache(false) to force it to send nocache headers
*
}
}
+ # Use adaptive TTLs for CDN so delayed/failed purges are noticed less often.
+ # This could use getTouched(), but that could be scary for major template edits.
+ $outputPage->adaptCdnTTL( $this->mPage->getTimestamp(), IExpiringStore::TTL_DAY );
+
# Check for any __NOINDEX__ tags on the page using $pOutput
$policy = $this->getRobotPolicy( 'view', $pOutput );
$outputPage->setIndexPolicy( $policy['index'] );
$this->mPage->doViewUpdates( $user, $oldid );
$outputPage->addModules( 'mediawiki.action.view.postEdit' );
-
}
/**
if ( $title->inNamespace( NS_CATEGORY ) ) {
$this->closeShowCategory();
}
+
+ # Use adaptive TTLs for CDN so delayed/failed purges are noticed less often
+ $outputPage = $this->getContext()->getOutput();
+ $outputPage->adaptCdnTTL( $this->mPage->getTouched(), IExpiringStore::TTL_MINUTE );
}
function openShowCategory() {