Files
kaubuntu.re/includes/simple-cache.php
T

167 lines
4.2 KiB
PHP

<?php
/**
* Cache simple pour les API PeerTube - optimisation minimale
*/
class SimpleAPICache {
private $cacheDir;
private $enabled;
public function __construct() {
$this->cacheDir = __DIR__ . '/../cache/api';
$this->enabled = true;
// Créer le répertoire de cache s'il n'existe pas
if (!is_dir($this->cacheDir)) {
mkdir($this->cacheDir, 0755, true);
}
}
/**
* Génère une clé de cache
*/
private function getCacheKey($endpoint, $params = []) {
$key = $endpoint;
if (!empty($params)) {
ksort($params);
$key .= '_' . md5(serialize($params));
}
return 'cache_' . md5($key) . '.json';
}
/**
* Récupère depuis le cache
*/
public function get($endpoint, $params = []) {
if (!$this->enabled) return null;
$file = $this->cacheDir . '/' . $this->getCacheKey($endpoint, $params);
if (!file_exists($file)) {
return null;
}
$data = json_decode(file_get_contents($file), true);
// Vérifier l'expiration
if (isset($data['expires']) && time() > $data['expires']) {
unlink($file);
return null;
}
return $data['content'] ?? null;
}
/**
* Stocke dans le cache
*/
public function set($endpoint, $params, $content, $ttl = 300) {
if (!$this->enabled) return;
$file = $this->cacheDir . '/' . $this->getCacheKey($endpoint, $params);
$data = [
'content' => $content,
'expires' => time() + $ttl,
'created' => time()
];
file_put_contents($file, json_encode($data));
}
/**
* Nettoie le cache expiré
*/
public function cleanup() {
$files = glob($this->cacheDir . '/cache_*.json');
$cleaned = 0;
foreach ($files as $file) {
$data = json_decode(file_get_contents($file), true);
if (isset($data['expires']) && time() > $data['expires']) {
unlink($file);
$cleaned++;
}
}
return $cleaned;
}
}
// Instance globale
$GLOBALS['simple_api_cache'] = new SimpleAPICache();
/**
* Version cachée de callPeerTubeApi - remplace l'originale
*/
function callPeerTubeApiCached($endpoint, $params = []) {
$cache = $GLOBALS['simple_api_cache'];
// TTL selon le type de contenu
$ttlMap = [
'videos/categories' => 3600, // 1 heure
'videos' => 600, // 10 minutes (augmenté)
'search/videos' => 600, // 10 minutes
'wp-posts' => 900, // 15 minutes pour WordPress
'accounts' => 300 // 5 minutes pour live streams
];
// TTL dynamique selon l'endpoint
$ttl = 300; // Défaut 5 minutes
foreach ($ttlMap as $pattern => $time) {
if (strpos($endpoint, $pattern) !== false) {
$ttl = $time;
break;
}
}
// Essayer le cache d'abord
$cached = $cache->get($endpoint, $params);
if ($cached !== null) {
return $cached;
}
// Appeler l'API originale
$data = callPeerTubeApiOriginal($endpoint, $params);
// Mettre en cache si on a des données
if (!empty($data)) {
$cache->set($endpoint, $params, $data, $ttl);
}
return $data;
}
/**
* Cache générique pour tout type d'API
*/
function callApiCached($cacheKey, $callable, $ttl = 900) {
$cache = $GLOBALS['simple_api_cache'];
// Essayer le cache d'abord
$cached = $cache->get($cacheKey, []);
if ($cached !== null) {
return $cached;
}
// Appeler la fonction fournie
try {
$data = call_user_func($callable);
} catch (Exception $e) {
error_log('API call failed for ' . $cacheKey . ': ' . $e->getMessage());
return [];
}
// Mettre en cache si on a des données
if (!empty($data)) {
$cache->set($cacheKey, [], $data, $ttl);
}
return $data;
}
// Nettoyage automatique occasionnel
if (rand(1, 100) === 1) {
$GLOBALS['simple_api_cache']->cleanup();
}
?>