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();
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |