63 lines
1.7 KiB
PHP
63 lines
1.7 KiB
PHP
<?php
|
|
namespace nur\b\io;
|
|
|
|
use Exception;
|
|
use Generator;
|
|
|
|
/**
|
|
* Class CacheFile: un fichier que l'on construit si besoin
|
|
*/
|
|
class CacheFile extends FileCachedValue {
|
|
function __construct(?string $file=null, ?array $params=null) {
|
|
if ($file !== null) $params["file"] = $file;
|
|
parent::__construct($params);
|
|
}
|
|
|
|
/** @var callable */
|
|
protected $compute;
|
|
|
|
protected function compute() {
|
|
$compute = $this->compute;
|
|
return $compute !== null? $compute(): null;
|
|
}
|
|
|
|
/**
|
|
* écrire le résultat de la fonction $compute dans le fichier si le cache a
|
|
* expiré ou si le fichier n'existe pas. sinon, la fonction n'est pas appelée
|
|
*/
|
|
function put(callable $compute, bool $noCache=false) {
|
|
$this->compute = $compute;
|
|
try {
|
|
if ($this->shouldUpdate($noCache)) {
|
|
try {
|
|
$data = $compute();
|
|
if ($data instanceof Generator) {
|
|
#XXX ne pas utiliser iterator_to_array() qui semble avoir un souci
|
|
# avec les générateurs imbriqués
|
|
$items = [];
|
|
foreach ($data as $item) {
|
|
$items[] = $item;
|
|
}
|
|
$data = $items;
|
|
}
|
|
if ($this->shouldCache($data)) {
|
|
$this->save($data, $this->ppFile);
|
|
} else {
|
|
# ne pas garder le fichier s'il ne faut pas mettre en cache
|
|
unlink($this->ppFile);
|
|
}
|
|
} catch (Exception $e) {
|
|
// si une erreur se produit, ne pas garder le fichier
|
|
unlink($this->ppFile);
|
|
throw $e;
|
|
}
|
|
} else {
|
|
$data = $this->load($this->ppFile);
|
|
}
|
|
return $data;
|
|
} finally {
|
|
$this->cleanup();
|
|
}
|
|
}
|
|
}
|