optimiser la destination du cache

This commit is contained in:
Jephté Clain 2025-10-05 17:27:12 +04:00
parent 291db941b9
commit d8b70d7ee0
5 changed files with 30 additions and 8 deletions

View File

@ -18,6 +18,9 @@ class CachectlApp extends Application {
["-r", "--read", "name" => "action", "value" => self::ACTION_READ,
"help" => "Afficher le contenu d'un fichier cache",
],
["-d::", "--data",
"help" => "Identifiant de la donnée à afficher",
],
["-i", "--infos", "name" => "action", "value" => self::ACTION_INFOS,
"help" => "Afficher des informations sur le fichier cache",
],
@ -43,6 +46,8 @@ class CachectlApp extends Application {
protected $updateAction, $updateDuration;
protected $data = null;
function setActionUpdate(int $action, $updateDuration): void {
$this->action = self::ACTION_UPDATE;
switch ($action) {
@ -90,7 +95,7 @@ class CachectlApp extends Application {
"duration" => "INF",
"override_duration" => true,
]);
yaml::dump($cache->get());
yaml::dump($cache->get($this->data));
break;
case self::ACTION_INFOS:
if ($showSection) msg::section($file);

View File

@ -6,7 +6,7 @@ use nulib\php\func;
use Traversable;
/**
* Interface CacheData: gestion d'une donnée mise en cache
* Class CacheData: gestion d'une donnée mise en cache
*/
abstract class CacheData {
function __construct(?string $name, $compute) {
@ -29,6 +29,12 @@ abstract class CacheData {
return $data;
}
/**
* le cache est-il externe? si non, utiliser {@link setDatafile()} pour
* spécifier le fichier destination de la valeur
*/
abstract function isExternal(): bool;
/** spécifier le chemin du cache à partir du fichier de base */
abstract function setDatafile(?string $basefile): void;

View File

@ -217,10 +217,12 @@ class CacheFile extends SharedFile {
return null;
}
protected function refreshData($data, bool $noCache) {
$source = $this->sources[$data] ?? null;
protected function refreshData($key, bool $noCache) {
$source = $this->sources[$key] ?? null;
$external = $source !== null && $source->isExternal();
$updateMetadata = $this->shouldUpdate($noCache);
if ($source === null) $updateData = $this->data === null;
if (!$key && !$external) $updateData = $this->data === null;
else $updateData = !$source->exists();
if (!$this->readonly && ($updateMetadata || $updateData)) {
$this->lockWrite();
@ -232,11 +234,12 @@ class CacheFile extends SharedFile {
$this->data = null;
$updateData = true;
}
if ($source === null) {
if (!$key && !$external) {
if ($updateData) {
# calculer la valeur
try {
$data = $this->compute();
if ($source !== null) $data = $source->compute();
else $data = $this->compute();
} catch (Exception $e) {
# le fichier n'est pas mis à jour, mais ce n'est pas gênant: lors
# des futurs appels, l'exception continuera d'être lancée ou la
@ -270,7 +273,7 @@ class CacheFile extends SharedFile {
$data = null;
}
}
} elseif ($source === null) {
} elseif (!$key && !$external) {
$data = $this->data;
} elseif ($source->exists()) {
$data = $source->load();

View File

@ -11,6 +11,10 @@ class CursorCacheData extends CacheData {
$this->channel = $channel;
}
function isExternal(): bool {
return true;
}
function setDatafile(?string $basefile): void {
}

View File

@ -27,6 +27,10 @@ class DataCacheData extends CacheData {
return $data;
}
function isExternal(): bool {
return false;
}
protected string $datafile;
function setDatafile(?string $basefile): void {