bibhamrokhanpin/wp-content/__plugins/wp-optimize/includes/class-wp-optimize-transients-cache.php
2024-04-10 17:46:06 +05:45

163 lines
3.4 KiB
PHP

<?php
if (!defined('WPO_VERSION')) die('No direct access allowed');
/**
* Class WP_Optimize_Transients_Cache
*/
class WP_Optimize_Transients_Cache {
private $_cache = array();
private $_expiration = array();
private $_keep_free_mem = false;
/**
* WP_Optimize_Transients_Cache constructor.
*/
public function __construct() {
}
/**
* Return instance of WP_Optimize_Transients_Cache.
*
* @return WP_Optimize_Transients_Cache
*/
public static function get_instance() {
static $instance;
if (null === $instance) {
$instance = new self();
}
return $instance;
}
/**
* Save $value to memory or to database depends on free memory.
*
* @param string $key
* @param mixed $value
* @param int $expiration
*/
public function set($key, &$value, $expiration = 0) {
$keep_free_mem = $this->_keep_free_mem ? $this->_keep_free_mem : 16 * 1048576;
$used_memory = memory_get_usage();
$free_memory = WP_Optimize()->get_free_memory();
$released_memory = 0;
$cache_keys = array_keys($this->_cache);
// release memory while we need.
while ($keep_free_mem > $free_memory + $released_memory && !empty($cache_keys)) {
$this->flush_value(array_shift($cache_keys));
$released_memory = $used_memory - memory_get_usage();
}
// if we have enough of free memory then save to memory.
if (WP_Optimize()->get_free_memory() > $keep_free_mem) {
$this->_cache[$key] = $value;
$this->_expiration[$key] = $expiration;
} else {
if (isset($this->_cache[$key])) {
unset($this->_cache[$key]);
}
if (isset($this->_expiration[$key])) {
unset($this->_expiration[$key]);
}
$this->set_transient($key, $value, $expiration);
}
}
/**
* Return value from cache by $key.
*
* @param string $key
* @return mixed
*/
public function get($key) {
if (array_key_exists($key, $this->_cache)) return $this->_cache[$key];
return $this->get_transient($key);
}
/**
* Delete value from cache.
*
* @param string $key
*/
public function delete($key) {
if (array_key_exists($key, $this->_cache)) {
unset($this->_cache[$key], $this->_expiration[$key]);
}
$this->delete_transient($key);
}
/**
* Set transient.
*
* @param int $key
* @param mixed $value
* @param int $expiration
*/
public function set_transient($key, $value, $expiration = 0) {
if (WP_Optimize()->is_multisite_mode()) {
set_site_transient($key, $value, $expiration);
} else {
set_transient($key, $value, $expiration);
}
}
/**
* Get transient.
*
* @param string $key
* @return mixed
*/
public function get_transient($key) {
if (WP_Optimize()->is_multisite_mode()) {
$value = get_site_transient($key);
} else {
$value = get_transient($key);
}
return $value;
}
/**
* Delete transient.
*
* @param string $key
*/
public function delete_transient($key) {
if (WP_Optimize()->is_multisite_mode()) {
delete_site_transient($key);
} else {
delete_transient($key);
}
}
/**
* Save value to database and remove from $_cache array.
*
* @param string $key
*/
public function flush_value($key) {
$this->set_transient($key, $this->_cache[$key], $this->_expiration[$key]);
unset($this->_cache[$key], $this->_expiration[$key]);
}
/**
* Save all _cache values to database.
*/
public function flush() {
foreach (array_keys($this->_cache) as $key) {
$this->flush_value($key);
}
}
}