From d50932612fd49be26361382aef6b18a541bf0aea Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sat, 28 Jun 2025 14:40:49 +0400 Subject: [PATCH] modifs.mineures sans commentaires --- src/cache/CacheFile.php | 97 ++++++++++++++++++++-------------- src/cli/AbstractStorageApp.php | 2 +- src/cli/NucacheApp.php | 4 +- tbin/test-nucache.php | 27 +++++----- 4 files changed, 73 insertions(+), 57 deletions(-) diff --git a/src/cache/CacheFile.php b/src/cache/CacheFile.php index 3feb150..18cc295 100644 --- a/src/cache/CacheFile.php +++ b/src/cache/CacheFile.php @@ -25,7 +25,7 @@ class CacheFile extends SharedFile { throw ValueException::invalid_type($source, CacheData::class); } - function __construct($file, ?array $params=null) { + function __construct($file, $data=null, ?array $params=null) { if ($file === null) { $rand = bin2hex(random_bytes(8)); $file = path::join(sys_get_temp_dir(), $rand); @@ -38,7 +38,7 @@ class CacheFile extends SharedFile { $this->overrideDuration = $params["override_duration"] ?? false; $this->readonly = $params["readonly"] ?? false; $this->cacheNull = $params["cache_null"] ?? false; - $data = $params["data"] ?? null; + $data ??= $params["data"] ?? null; $this->sources = null; if ($data === null) { $this->source = null; @@ -243,51 +243,70 @@ class CacheFile extends SharedFile { return null; } - function get($data=null, bool $noCache=false) { - return $this->action(function () use ($data, $noCache) { - $source = $this->getSource($data); - $dataname = $source->getName(); - $datafilename = ".{$this->basename}.{$dataname}".self::EXT; - $datafile = path::join($this->basedir, $datafilename); + protected function refreshData($data, bool $noCache) { + $source = $this->getSource($data); + $dataname = $source->getName(); + $datafilename = ".{$this->basename}.{$dataname}".self::EXT; + $datafile = path::join($this->basedir, $datafilename); - $updateMetadata = $this->shouldUpdate($noCache); - $updateData = !array_key_exists($datafilename, $this->datafilenames); - if (!$this->readonly && ($updateMetadata || $updateData)) { - $this->lockWrite(); - if ($updateMetadata) { - # il faut refaire tout le cache - $this->unlinkFiles(true); - $this->start = null; - $this->duration = null; - $updateData = true; - } - if ($updateData) { - # calculer un fichier - try { - $data = $source->get(); - } catch (Exception $e) { - # ne pas garder le fichier en cas d'exception - $this->unlinkDatafile($datafile); - throw $e; - } - } elseif (file_exists($datafile)) { - $data = $this->loadData($datafile); - } else { - $data = null; - } - if ($this->shouldCache($data)) { - $this->saveData($datafile, $data); - $this->datafilenames[$datafilename] = true; - } else { - # ne pas garder le fichier s'il ne faut pas mettre en cache + $updateMetadata = $this->shouldUpdate($noCache); + $updateData = !array_key_exists($datafilename, $this->datafilenames); + if (!$this->readonly && ($updateMetadata || $updateData)) { + $this->lockWrite(); + if ($updateMetadata) { + # il faut refaire tout le cache + $this->unlinkFiles(true); + $this->start = null; + $this->duration = null; + $updateData = true; + } + if ($updateData) { + # calculer un fichier + try { + $data = $source->get(); + } catch (Exception $e) { + # ne pas garder le fichier en cas d'exception $this->unlinkDatafile($datafile); + throw $e; } } elseif (file_exists($datafile)) { $data = $this->loadData($datafile); } else { $data = null; } - return $data; + if ($this->shouldCache($data)) { + $this->saveData($datafile, $data); + $this->datafilenames[$datafilename] = true; + } else { + # ne pas garder le fichier s'il ne faut pas mettre en cache + $this->unlinkDatafile($datafile); + } + } elseif (file_exists($datafile)) { + $data = $this->loadData($datafile); + } else { + $data = null; + } + return $data; + } + + /** + * s'assurer que le cache est à jour avec les données les plus récentes. si + * les données sont déjà présentes dans le cache et n'ont pas encore expirées + * cette méthode est un NOP + */ + function refresh(bool $noCache=false): self { + $source = $this->source; + if ($source !== null) $datas = [null]; + else $datas = array_keys($this->sources); + foreach ($datas as $data) { + $this->refreshData($data, $noCache); + } + return $this; + } + + function get($data=null, bool $noCache=false) { + return $this->action(function () use ($data, $noCache) { + return $this->refreshData($data, $noCache); }); } diff --git a/src/cli/AbstractStorageApp.php b/src/cli/AbstractStorageApp.php index 9526d74..81504b1 100644 --- a/src/cli/AbstractStorageApp.php +++ b/src/cli/AbstractStorageApp.php @@ -98,7 +98,7 @@ abstract class AbstractStorageApp extends Application { } } $first = true; - $capacitor->each($filter, function ($item, $row) use (&$first) { + $capacitor->each($filter, function ($row) use (&$first) { if ($first) $first = false; else echo "---\n"; yaml::dump($row); diff --git a/src/cli/NucacheApp.php b/src/cli/NucacheApp.php index 7248f47..6845ee5 100644 --- a/src/cli/NucacheApp.php +++ b/src/cli/NucacheApp.php @@ -87,7 +87,7 @@ class NucacheApp extends Application { switch ($this->action) { case self::ACTION_READ: if ($showSection) msg::section($file); - $cache = new CacheFile($file, [ + $cache = new CacheFile($file, null, [ "readonly" => true, "duration" => "INF", "override_duration" => true, @@ -96,7 +96,7 @@ class NucacheApp extends Application { break; case self::ACTION_INFOS: if ($showSection) msg::section($file); - $cache = new CacheFile($file, [ + $cache = new CacheFile($file, null, [ "readonly" => true, ]); yaml::dump($cache->getInfos()); diff --git a/tbin/test-nucache.php b/tbin/test-nucache.php index 802926f..d148ee6 100755 --- a/tbin/test-nucache.php +++ b/tbin/test-nucache.php @@ -17,22 +17,22 @@ function show(string $prefix, CacheFile $cache, bool $dumpInfos=true): void { //system("rm -f *.cache .*.cache"); $what = [ - //"null", + "null", "one", - //"two", - //"three", + "two", + "three", ]; $duration = 10; if (in_array("null", $what)) { - $null = new CacheFile("null", [ + $null = new CacheFile("null", null, [ "duration" => $duration, ]); show("null", $null); } if (in_array("one", $what)) { - $one = new class("one", [ + $one = new class("one", null, [ "duration" => $duration, ]) extends CacheFile { protected function compute() { @@ -43,11 +43,10 @@ if (in_array("one", $what)) { } if (in_array("two", $what)) { - $two = new CacheFile("two", [ + $two = new CacheFile("two", new CacheData(function () { + return 2; + }), [ "duration" => $duration, - "data" => new CacheData(function () { - return 2; - }), ]); show("two", $two); } @@ -62,12 +61,10 @@ if (in_array("three", $what)) { }); $three = new CacheFile("three", [ - "data" => [ - "data31" => $data31, - $data31, # name=data31name - "data32" => $data32, - $data32, # name="" - ], + "data31" => $data31, + $data31, # name=data31name + "data32" => $data32, + $data32, # name="" ]); Txx("three.0=", $three->get("data31")); Txx("three.1=", $three->get("data31name"));