wp_back/wp-content/plugins/debloat/inc/file-cache.php
2024-05-20 15:37:46 +03:00

173 lines
3.4 KiB
PHP

<?php
namespace Sphere\Debloat;
/**
* Filesystem based cache for assets.
*
* @author asadkn
* @since 1.0.0
*/
class FileCache
{
/**
* @var Filesystem
*/
protected $fs;
public $cache_path;
public $cache_url;
public function __construct()
{
$this->fs = Plugin::file_system();
$this->cache_path = WP_CONTENT_DIR . '/cache/debloat/';
$this->cache_url = WP_CONTENT_URL . '/cache/debloat/';
}
/**
* Get a cached file path.
*
* @param string $id
* @return bool
*/
public function get($id)
{
$file = $this->get_file_name($id);
if (!$file) {
return false;
}
$file = $this->get_cache_path($id) . $file;
if ($this->fs->is_file($file)) {
return $file;
}
return false;
}
/**
* Get a cached file URL.
*
* @param string $id
* @return bool|string
*/
public function get_url($id)
{
if (!$this->get($id)) {
return false;
}
$file = $this->get_file_name($id);
if (!$file) {
return false;
}
return $this->cache_url . $this->get_cache_type($file) . '/' . $file;
}
/**
* Get file name for cache storage/retrieval provided a URL or path.
*
* @param string $id URL or path of a file.
* @return string
*/
protected function get_file_name($id)
{
// Get a local path if a valid URL was provided. Remote URLs also work.
$file = $this->fs->url_to_local($id);
if (!$file) {
// Remote here.
}
// MD5 on the id instead of file, as it's likely to be a URL that can has a changing
// query string reuqiring a new cached entry.
$hash = md5($id);
return $hash . '.' . $this->get_cache_type($file ?: $id);
}
/**
* Save a file in the cache.
*
* @param string $id Path, a local asset URL, or a unqiue name.
* @param string $content
* @return bool|string File path on success or false on failure.
*/
public function set($id, string $content = '')
{
if (!$content) {
return false;
}
// Ensure path exists.
$path = $this->get_cache_path($id);
$this->fs->mkdir_p($path);
$file = $path . $this->get_file_name($id);
if ($this->fs->put_contents($file, $content)) {
return $file;
}
return false;
}
/**
* Get cache path based on provided file path or id.
*
* @param string $asset A local path or a URL.
* @return string
*/
public function get_cache_path($asset = '')
{
$path = $this->cache_path;
$asset = $asset ? $this->fs->url_to_local($asset) : '';
// Path with asset type directory.
return $path . $this->get_cache_type($asset) . '/';
}
/**
* Get the type of cache group based on file extension.
*
* @param string $id File path or name. URLs fine too.
* @return string
*/
protected function get_cache_type(string $file)
{
$extension = pathinfo($file, PATHINFO_EXTENSION);
$type = $extension === 'js' ? 'js' : 'css';
return $type;
}
/**
* Delete all the cached files for specified cache.
*
* @param string $type
* @return void
*/
public function delete_cache($type = 'js')
{
$dir = $this->cache_path . $type . '/';
$files = (array) $this->fs->dirlist($dir);
foreach ($files as $file) {
$this->fs->delete($dir . $file['name']);
}
}
/**
* Get number of files in cache for a specific type.
*
* @param string $type
* @return integer
*/
public function get_stats($type = 'js')
{
$dir = $this->cache_path . $type;
$files = $this->fs->dirlist($dir);
return $files ? count($files) : 0;
}
}