130 lines
3.2 KiB
PHP
130 lines
3.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' => 300, // 5 minutes
|
|
'search/videos' => 600 // 10 minutes
|
|
];
|
|
|
|
$ttl = $ttlMap[$endpoint] ?? 300;
|
|
|
|
// 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;
|
|
}
|
|
|
|
// Nettoyage automatique occasionnel
|
|
if (rand(1, 100) === 1) {
|
|
$GLOBALS['simple_api_cache']->cleanup();
|
|
}
|
|
?>
|