// custom prefixes used by thing like WANObjectCache, limit to 205.
$charsLeft = 205 - strlen( $keyspace ) - count( $args );
- $args = array_map(
- function ( $arg ) use ( &$charsLeft ) {
- $arg = strtr( $arg, ' ', '_' );
+ foreach ( $args as &$arg ) {
+ $arg = strtr( $arg, ' ', '_' );
- // Make sure %, #, and non-ASCII chars are escaped
- $arg = preg_replace_callback(
- '/[^\x21-\x22\x24\x26-\x39\x3b-\x7e]+/',
- function ( $m ) {
- return rawurlencode( $m[0] );
- },
- $arg
- );
+ // Make sure %, #, and non-ASCII chars are escaped
+ $arg = preg_replace_callback(
+ '/[^\x21-\x22\x24\x26-\x39\x3b-\x7e]+/',
+ function ( $m ) {
+ return rawurlencode( $m[0] );
+ },
+ $arg
+ );
- // 33 = 32 characters for the MD5 + 1 for the '#' prefix.
- if ( $charsLeft > 33 && strlen( $arg ) > $charsLeft ) {
- $arg = '#' . md5( $arg );
- }
+ // 33 = 32 characters for the MD5 + 1 for the '#' prefix.
+ if ( $charsLeft > 33 && strlen( $arg ) > $charsLeft ) {
+ $arg = '#' . md5( $arg );
+ }
- $charsLeft -= strlen( $arg );
- return $arg;
- },
- $args
- );
+ $charsLeft -= strlen( $arg );
+ }
if ( $charsLeft < 0 ) {
return $keyspace . ':BagOStuff-long-key:##' . md5( implode( ':', $args ) );
}
/**
- * TTLs higher than 30 days will be detected as absolute TTLs
- * (UNIX timestamps), and will result in the cache entry being
- * discarded immediately because the expiry is in the past.
- * Clamp expires >30d at 30d, unless they're >=1e9 in which
- * case they are likely to really be absolute (1e9 = 2011-09-09)
- * @param int $expiry
+ * @param int|float $exptime
* @return int
*/
- function fixExpiry( $expiry ) {
- if ( $expiry > 2592000 && $expiry < 1000000000 ) {
- $expiry = 2592000;
+ protected function fixExpiry( $exptime ) {
+ if ( $exptime < 0 ) {
+ // The PECL driver does not seem to like negative relative values
+ $expiresAt = $this->getCurrentTime() + $exptime;
+ } elseif ( $this->isRelativeExpiration( $exptime ) ) {
+ // TTLs higher than 30 days will be detected as absolute TTLs
+ // (UNIX timestamps), and will result in the cache entry being
+ // discarded immediately because the expiry is in the past.
+ // Clamp expires >30d at 30d, unless they're >=1e9 in which
+ // case they are likely to really be absolute (1e9 = 2011-09-09)
+ $expiresAt = min( $exptime, self::TTL_MONTH );
+ } else {
+ $expiresAt = $exptime;
}
- return (int)$expiry;
+
+ return (int)$expiresAt;
}
}