%PDF- %PDF-
| Direktori : /www/klubovnaostrava/www/wp-content/plugins/pretix-widget/includes/ |
| Current File : /www/klubovnaostrava/www/wp-content/plugins/pretix-widget/includes/cache.php |
<?php
/**
* Class Cache
*
* This class handles caching of files in the Pretix_Widget plugin.
*
* @package Pretix_Widget
* @version 1.0.00
*/
namespace Pretix_Widget;
use Exception;
class Cache extends Base {
public $debug = false;
private $parent;
private $cache_path = '/pretix-widget/cache/'; // Relative to wp_upload_dir()['basedir']
private $cache_url = '/pretix-widget/cache/'; // Relative to wp_upload_dir()['basedir']
private $cache_time_max = 24 * 60 * 60;
/**
* Cache constructor.
*
* @param object $parent The parent object of the cache.
*
* @since 1.0.00
*/
public function __construct($parent) {
$this->parent = $parent;
$this->debug = $this->parent->debug;
$this->cache_path = wp_upload_dir()['basedir'] . $this->cache_path;
$this->cache_url = set_url_scheme(wp_upload_dir()['baseurl'] . $this->cache_url);
if ( ! file_exists($this->cache_path)) {
mkdir($this->cache_path, 0755, true);
}
$this->cache_time_max = get_option('pretix_widget_cache_time_max', $this->cache_time_max);
}
/**
* Get the cached file contents for the given URL.
*
* @param string $url The URL to get the cached file for.
*
* @return string The contents of the cached file.
* @since 1.0.00
*/
public function get(string $url): string {
$file_extension = pathinfo($url, PATHINFO_EXTENSION);
$cache_name = $this->get_cache_name($url);
return $this->get_file($url, $cache_name, $file_extension);
}
/**
* Get the cache name for the given URL.
*
* @param string $url The URL for which to get the cache name.
*
* @return string The cache name.
* @since 1.0.00
*/
private function get_cache_name($url) {
$cache_name = base64_encode($url);
return $cache_name;
}
/**
* Get the cached file for the given URL.
*
* @param string $url The URL for which to get the cached file.
* @param string $cache_name The cache name for the URL.
* @param string $file_extension The file extension of the URL.
*
* @return string The URL of the cached file.
* @since 1.0.00
*/
private function get_file($url, $cache_name, $file_extension): string {
$output = '';
$file = $cache_name . '.' . $file_extension;
if ($this->file_exists($this->get_cache_path($file))) {
$output = $this->get_cache_url($file);
} else {
$output = $this->download($url, $file);
}
return $output;
}
/**
* Check if the file exists and is not older than the max cache time.
*
* @param string $path The file path to check.
*
* @return bool True if the file exists and is not older than the max cache time, false otherwise.
* @since 1.0.00
*/
private function file_exists(string $path): bool {
return file_exists($path) && (time() - filemtime($path) < $this->cache_time_max) ? true : false;
}
/**
* Get the path of the cached file.
*
* @param string $file The filename of the cached file.
*
* @return string The path of the cached file.
* @since 1.0.00
*/
public function get_cache_path(string $file = ''): string {
return $this->cache_path . untrailingslashit($file);
}
/**
* Get the URL of the cached file.
*
* @param string $file The filename of the cached file.
*
* @return string The URL of the cached file.
* @since 1.0.00
*/
private function get_cache_url(string $file = ''): string {
return $this->cache_url . untrailingslashit($file);
}
/**
* Download the file from the given URL and save it to the cache.
*
* @param string $url The URL of the file to download.
* @param string $file The filename for the downloaded file.
*
* @return string The URL of the cached file or an empty string on failure.
* @since 1.0.00
*/
private function download(string $url, string $file): string {
$output = '';
try {
// Download file from URL
$file_data = wp_remote_get($url);
if ( ! is_wp_error($file_data) && $file_data['response']['code'] === 200) {
// Save the downloaded file to the cache folder relative to wp_upload_dir()['basedir']
$cached_file = trailingslashit($this->cache_path) . $file;
file_put_contents($cached_file, $file_data['body']);
// Return the URL of the cached file
$output = $this->get_cache_url($file);
}
} catch (Exception $e) {
// Error occurred during the download process
error_log($e->getMessage());
}
return $output;
}
/**
* Get an array of cached files with their details.
*
* @return array An array containing cached file details.
* @since 1.0.00
*/
public function get_files(): array {
$cache_path = $this->get_cache_path();
$files = array();
if (is_dir($cache_path)) {
$dir_handle = opendir($cache_path);
if ($dir_handle) {
while (($file = readdir($dir_handle)) !== false) {
if ($file != "." && $file != "..") {
$file_path = $cache_path . '/' . $file;
$files[] = array(
'name' => $this->decode($file),
'size' => $this->format_file_size(filesize($file_path)),
'date' => date('Y-m-d H:i:s', filemtime($file_path))
);
}
}
closedir($dir_handle);
}
}
return $files;
}
/**
* Decode the base64 encoded filename to get the original URL.
*
* @param string $file The base64 encoded filename.
*
* @return string The decoded URL.
* @since 1.0.00
*/
private function decode(string $file): string {
return base64_decode(preg_replace('/\.[^.]+$/', '', $file));
}
/**
* Format the file size in bytes to a human-readable format.
*
* @param int $size The file size in bytes.
*
* @return string The formatted file size with units (B, KB, MB, GB, TB).
* @since 1.0.00
*/
private function format_file_size($size) {
$units = array('B', 'KB', 'MB', 'GB', 'TB');
$i = 0;
while ($size >= 1024) {
$size /= 1024;
$i++;
}
return round($size, 2) . ' ' . $units[$i];
}
/**
* Flush the cache by downloading all cached files again.
*
* @return array An array with status and message indicating the success or failure of the cache flush.
* @since 1.0.00
*/
public function flush(): array {
$cache_dir = $this->get_cache_path();
$errors = [];
$files = scandir($cache_dir);
foreach ($files as $file) {
if ($file === '.' || $file === '..') {
continue;
}
// get base64 encoded url from filename without the file extension
$url = $this->decode($file);
// rebuild cache
if ($this->download($url, $file) === '') {
error_log(__('Download failed for', 'pretix-widget') . ' ' . $url);
$errors[] = $url;
}
}
return empty($errors) ? ['status' => 'success',
'message' => __('Cache flushed and rebuilt!', 'pretix-widget')
] :
['status' => 'error', 'message' => __('Couldn\'t download files:', 'pretix-widget'), 'errors' => $errors];
}
/**
* Set the maximum cache time.
*
* @param mixed $number The maximum cache time in hours.
*
* @since 1.0.00
*/
public function set_max_cache_time(mixed $number): array {
$errors = [];
// allow reset with empty value
if (empty($number)) {
$number = 24;
}
// convert string to number
if ( ! is_numeric($number)) {
$number = (int)$number;
}
// check for zeros / convert to seconds
$new_max_cache_time = $number <= 0 ? 0 : $number * 60 * 60;
update_option('pretix_widget_cache_time_max', $new_max_cache_time);
$this->cache_time_max = $new_max_cache_time;
return empty($errors) ? ['status' => 'success',
'message' => __('Cache time changed!', 'pretix-widget')
] :
['status' => 'error', 'message' => __('Couldn\'t change cache time!', 'pretix-widget'), 'errors' => $errors];
}
/**
* Get the maximum cache time.
*
* @return float The maximum cache time in hours.
* @since 1.0.00
*/
public function get_max_cache_time() {
return $this->cache_time_max / 60 / 60;
}
}