326 lines
9.2 KiB
PHP
326 lines
9.2 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* @package Freemius
|
||
|
* @copyright Copyright (c) 2015, Freemius, Inc.
|
||
|
* @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
|
||
|
* @since 1.1.6
|
||
|
*/
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
class FS_Cache_Manager {
|
||
|
/**
|
||
|
* @var FS_Option_Manager
|
||
|
*/
|
||
|
private $_options;
|
||
|
/**
|
||
|
* @var FS_Logger
|
||
|
*/
|
||
|
private $_logger;
|
||
|
|
||
|
/**
|
||
|
* @var FS_Cache_Manager[]
|
||
|
*/
|
||
|
private static $_MANAGERS = array();
|
||
|
|
||
|
/**
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.1.3
|
||
|
*
|
||
|
* @param string $id
|
||
|
*/
|
||
|
private function __construct( $id ) {
|
||
|
$this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_cach_mngr_' . $id, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK );
|
||
|
|
||
|
$this->_logger->entrance();
|
||
|
$this->_logger->log( 'id = ' . $id );
|
||
|
|
||
|
$this->_options = FS_Option_Manager::get_manager( $id, true, true, false );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.1.6
|
||
|
*
|
||
|
* @param $id
|
||
|
*
|
||
|
* @return FS_Cache_Manager
|
||
|
*/
|
||
|
static function get_manager( $id ) {
|
||
|
$id = strtolower( $id );
|
||
|
|
||
|
if ( ! isset( self::$_MANAGERS[ $id ] ) ) {
|
||
|
self::$_MANAGERS[ $id ] = new FS_Cache_Manager( $id );
|
||
|
}
|
||
|
|
||
|
return self::$_MANAGERS[ $id ];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.1.6
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
function is_empty() {
|
||
|
$this->_logger->entrance();
|
||
|
|
||
|
return $this->_options->is_empty();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.1.6
|
||
|
*/
|
||
|
function clear() {
|
||
|
$this->_logger->entrance();
|
||
|
|
||
|
$this->_options->clear( true );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Delete cache manager from DB.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.0.9
|
||
|
*/
|
||
|
function delete() {
|
||
|
$this->_options->delete();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if there's a cached item.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.1.6
|
||
|
*
|
||
|
* @param string $key
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
function has( $key ) {
|
||
|
$cache_entry = $this->_options->get_option( $key, false );
|
||
|
|
||
|
return ( is_object( $cache_entry ) &&
|
||
|
isset( $cache_entry->timestamp ) &&
|
||
|
is_numeric( $cache_entry->timestamp )
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if there's a valid cached item.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.1.6
|
||
|
*
|
||
|
* @param string $key
|
||
|
* @param null|int $expiration Since 1.2.2.7
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
function has_valid( $key, $expiration = null ) {
|
||
|
$cache_entry = $this->_options->get_option( $key, false );
|
||
|
|
||
|
$is_valid = ( is_object( $cache_entry ) &&
|
||
|
isset( $cache_entry->timestamp ) &&
|
||
|
is_numeric( $cache_entry->timestamp ) &&
|
||
|
$cache_entry->timestamp > WP_FS__SCRIPT_START_TIME
|
||
|
);
|
||
|
|
||
|
if ( $is_valid &&
|
||
|
is_numeric( $expiration ) &&
|
||
|
isset( $cache_entry->created ) &&
|
||
|
is_numeric( $cache_entry->created ) &&
|
||
|
$cache_entry->created + $expiration < WP_FS__SCRIPT_START_TIME
|
||
|
) {
|
||
|
/**
|
||
|
* Even if the cache is still valid, since we are checking for validity
|
||
|
* with an explicit expiration period, if the period has past, return
|
||
|
* `false` as if the cache is invalid.
|
||
|
*
|
||
|
* @since 1.2.2.7
|
||
|
*/
|
||
|
$is_valid = false;
|
||
|
}
|
||
|
|
||
|
return $is_valid;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.1.6
|
||
|
*
|
||
|
* @param string $key
|
||
|
* @param mixed $default
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
function get( $key, $default = null ) {
|
||
|
$this->_logger->entrance( 'key = ' . $key );
|
||
|
|
||
|
$cache_entry = $this->_options->get_option( $key, false );
|
||
|
|
||
|
if ( is_object( $cache_entry ) &&
|
||
|
isset( $cache_entry->timestamp ) &&
|
||
|
is_numeric( $cache_entry->timestamp )
|
||
|
) {
|
||
|
return $cache_entry->result;
|
||
|
}
|
||
|
|
||
|
return is_object( $default ) ? clone $default : $default;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.1.6
|
||
|
*
|
||
|
* @param string $key
|
||
|
* @param mixed $default
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
function get_valid( $key, $default = null ) {
|
||
|
$this->_logger->entrance( 'key = ' . $key );
|
||
|
|
||
|
$cache_entry = $this->_options->get_option( $key, false );
|
||
|
|
||
|
if ( is_object( $cache_entry ) &&
|
||
|
isset( $cache_entry->timestamp ) &&
|
||
|
is_numeric( $cache_entry->timestamp ) &&
|
||
|
$cache_entry->timestamp > WP_FS__SCRIPT_START_TIME
|
||
|
) {
|
||
|
return $cache_entry->result;
|
||
|
}
|
||
|
|
||
|
return is_object( $default ) ? clone $default : $default;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.1.6
|
||
|
*
|
||
|
* @param string $key
|
||
|
* @param mixed $value
|
||
|
* @param int $expiration
|
||
|
* @param int $created Since 2.0.0 Cache creation date.
|
||
|
*/
|
||
|
function set( $key, $value, $expiration = WP_FS__TIME_24_HOURS_IN_SEC, $created = WP_FS__SCRIPT_START_TIME ) {
|
||
|
$this->_logger->entrance( 'key = ' . $key );
|
||
|
|
||
|
$cache_entry = new stdClass();
|
||
|
|
||
|
$cache_entry->result = $value;
|
||
|
$cache_entry->created = $created;
|
||
|
$cache_entry->timestamp = $created + $expiration;
|
||
|
$this->_options->set_option( $key, $cache_entry, true );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get cached record expiration, or false if not cached or expired.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.1.7.3
|
||
|
*
|
||
|
* @param string $key
|
||
|
*
|
||
|
* @return bool|int
|
||
|
*/
|
||
|
function get_record_expiration( $key ) {
|
||
|
$this->_logger->entrance( 'key = ' . $key );
|
||
|
|
||
|
$cache_entry = $this->_options->get_option( $key, false );
|
||
|
|
||
|
if ( is_object( $cache_entry ) &&
|
||
|
isset( $cache_entry->timestamp ) &&
|
||
|
is_numeric( $cache_entry->timestamp ) &&
|
||
|
$cache_entry->timestamp > WP_FS__SCRIPT_START_TIME
|
||
|
) {
|
||
|
return $cache_entry->timestamp;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Purge cached item.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.1.6
|
||
|
*
|
||
|
* @param string $key
|
||
|
*/
|
||
|
function purge( $key ) {
|
||
|
$this->_logger->entrance( 'key = ' . $key );
|
||
|
|
||
|
$this->_options->unset_option( $key, true );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Extend cached item caching period.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.0.0
|
||
|
*
|
||
|
* @param string $key
|
||
|
* @param int $expiration
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
function update_expiration( $key, $expiration = WP_FS__TIME_24_HOURS_IN_SEC ) {
|
||
|
$this->_logger->entrance( 'key = ' . $key );
|
||
|
|
||
|
$cache_entry = $this->_options->get_option( $key, false );
|
||
|
|
||
|
if ( ! is_object( $cache_entry ) ||
|
||
|
! isset( $cache_entry->timestamp ) ||
|
||
|
! is_numeric( $cache_entry->timestamp )
|
||
|
) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$this->set( $key, $cache_entry->result, $expiration, $cache_entry->created );
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set cached item as expired.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 1.2.2.7
|
||
|
*
|
||
|
* @param string $key
|
||
|
*/
|
||
|
function expire( $key ) {
|
||
|
$this->_logger->entrance( 'key = ' . $key );
|
||
|
|
||
|
$cache_entry = $this->_options->get_option( $key, false );
|
||
|
|
||
|
if ( is_object( $cache_entry ) &&
|
||
|
isset( $cache_entry->timestamp ) &&
|
||
|
is_numeric( $cache_entry->timestamp )
|
||
|
) {
|
||
|
// Set to expired.
|
||
|
$cache_entry->timestamp = WP_FS__SCRIPT_START_TIME;
|
||
|
$this->_options->set_option( $key, $cache_entry, true );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#--------------------------------------------------------------------------------
|
||
|
#region Migration
|
||
|
#--------------------------------------------------------------------------------
|
||
|
|
||
|
/**
|
||
|
* Migrate options from site level.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.0.0
|
||
|
*/
|
||
|
function migrate_to_network() {
|
||
|
$this->_options->migrate_to_network();
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
}
|