2025-07-18 09:31:30 +04:00
|
|
|
<?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
|
2025-09-28 20:38:51 +04:00
|
|
|
'videos' => 600, // 10 minutes (augmenté)
|
|
|
|
|
'search/videos' => 600, // 10 minutes
|
|
|
|
|
'wp-posts' => 900, // 15 minutes pour WordPress
|
|
|
|
|
'accounts' => 300 // 5 minutes pour live streams
|
2025-07-18 09:31:30 +04:00
|
|
|
];
|
|
|
|
|
|
2025-09-28 20:38:51 +04:00
|
|
|
// TTL dynamique selon l'endpoint
|
|
|
|
|
$ttl = 300; // Défaut 5 minutes
|
|
|
|
|
foreach ($ttlMap as $pattern => $time) {
|
|
|
|
|
if (strpos($endpoint, $pattern) !== false) {
|
|
|
|
|
$ttl = $time;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-07-18 09:31:30 +04:00
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-28 20:38:51 +04:00
|
|
|
/**
|
|
|
|
|
* 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;
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-18 09:31:30 +04:00
|
|
|
// Nettoyage automatique occasionnel
|
|
|
|
|
if (rand(1, 100) === 1) {
|
|
|
|
|
$GLOBALS['simple_api_cache']->cleanup();
|
|
|
|
|
}
|
|
|
|
|
?>
|