feat: add cache to optimize API calls

This commit is contained in:
2025-07-18 09:31:30 +04:00
parent 53460c0132
commit ef1c1ebd5e
3 changed files with 157 additions and 3 deletions
+4 -1
View File
@@ -20,6 +20,9 @@ mentions-legales.php
tmp/
temp/
# Fichiers de cache
cache/
# Fichiers de dépendances (si nécessaire)
# vendor/
# node_modules/
# node_modules/
+23 -2
View File
@@ -3,6 +3,9 @@
// Charger les fonctions de sécurité
require_once __DIR__ . '/security.php';
// Charger le système de cache simple
require_once __DIR__ . '/simple-cache.php';
// Charger d'abord la configuration locale si elle existe
$config_local_file = __DIR__ . '/config.local.php';
if (file_exists($config_local_file)) {
@@ -77,13 +80,14 @@ function initCategories() {
}
/**
* Fonction utilitaire pour appeler l'API PeerTube
* Version originale pour appeler l'API PeerTube (sans cache)
* Cette fonction est maintenant utilisée en interne par callPeerTubeApi
*
* @param string $endpoint Point de terminaison de l'API
* @param array $params Paramètres optionnels pour la requête
* @return array Données retournées par l'API
*/
function callPeerTubeApi($endpoint, $params = []) {
function callPeerTubeApiOriginal($endpoint, $params = []) {
// Validation de l'URL de base PeerTube pour prévenir SSRF
if (!isValidPeerTubeUrl(PEERTUBE_URL)) {
error_log('SECURITY: Invalid PeerTube URL detected: ' . PEERTUBE_URL);
@@ -146,6 +150,23 @@ function callPeerTubeApi($endpoint, $params = []) {
return $data ?: [];
}
/**
* Fonction utilitaire pour appeler l'API PeerTube avec cache
*
* @param string $endpoint Point de terminaison de l'API
* @param array $params Paramètres optionnels pour la requête
* @return array Données retournées par l'API
*/
function callPeerTubeApi($endpoint, $params = []) {
// Utiliser la fonction cachée si disponible
if (function_exists('callPeerTubeApiCached')) {
return callPeerTubeApiCached($endpoint, $params);
}
// Fallback vers la version originale
return callPeerTubeApiOriginal($endpoint, $params);
}
/**
* Valide l'URL PeerTube pour prévenir les attaques SSRF
*
+130
View File
@@ -0,0 +1,130 @@
<?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();
}
?>