PEEL Shopping
Open source ecommerce : PEEL Shopping
Cache.php
Go to the documentation of this file.
1 <?php
2 // This file should be in UTF8 without BOM - Accents examples: éèê
3 // +----------------------------------------------------------------------+
4 // | Copyright (c) 2004-2015 Advisto SAS, service PEEL - contact@peel.fr |
5 // +----------------------------------------------------------------------+
6 // | This file is part of PEEL Shopping 8.0.0, which is subject to an |
7 // | opensource GPL license: you are allowed to customize the code |
8 // | for your own needs, but must keep your changes under GPL |
9 // | More information: https://www.peel.fr/lire/licence-gpl-70.html |
10 // +----------------------------------------------------------------------+
11 // | Author: Advisto SAS, RCS 479 205 452, France, https://www.peel.fr/ |
12 // +----------------------------------------------------------------------+
13 // $Id: Cache.php 46935 2015-09-18 08:49:48Z gboussin $
14 if (!defined('IN_PEEL')) {
15  die();
16 }
17 
27 class Cache {
28  // Filename with path, generated automatically
29  var $file;
30  var $filemtime = null;
31  // Configuration, if not set default values are used
32  // directory => 'directory_name_with_complete_path'
33  // group => 'page'
34  var $cfg;
35 
42  function Cache($id, $cfg = array())
43  {
44  // Configuration par défaut
45  $cfgDefault = array('directory' => $GLOBALS['dirroot'] . '/' . $GLOBALS['site_parameters']['cache_folder'] . '/', 'group' => 'page');
46  // Si une config perso est envoyée
47  if (count($cfg)) {
48  foreach($cfgDefault as $k => $v) {
49  $this->cfg[$k] = !isset($cfg[$k]) ? $v : $cfg[$k];
50  }
51  } else {
52  // Sinon on charge la config par défaut
53  $this->cfg = $cfgDefault;
54  }
55  $this->file = $this->cfg['directory'] . String::substr(md5($this->cfg['group']), 0, 8) . '_' . String::substr(md5($id), 0, 16);
56  }
57 
66  function testTime($lifeTime = 7200, $update_timestamp_now = false)
67  {
68  $lifeTime = round($lifeTime);
69  // $update_timestamp_now permet de mettre à jour immédiatement le timestamp du fichier pour éviter que plusieurs utilisateurs
70  // cherchent à mettre à jour en même temps le même fichier (car décalage entre test des caches et sauvegarde du nouveau cache)
71  if (file_exists($this->file) === false || (($this->filemtime = @filemtime($this->file)) < time() - $lifeTime) || (!empty($_GET['update']) && $_GET['update'] == 1)) {
72  // Fichier de cache absent ou pas à jour
73  if ($update_timestamp_now && file_exists($this->file)) {
74  // On fait en sorte que le fichier de cache soit considéré comme OK si d'autres appels sont faits en parallèle,
75  // alors que nous allons le mettre à jour par la suite (on ne veut pas générer en parallèle n fois le fichier)
76  // mais si la génération échoue, 20 secondes après on réessaiera
77  touch($this->file, time() - $lifeTime + 20);
78  }
79  return false;
80  } else {
81  // Fichier de cache OK
82  return true;
83  }
84  }
85 
92  function testDate($lifeDate)
93  {
94  if (file_exists($this->file) === false || @filemtime($this->file) < $lifeDate || (!empty($_GET['update']) && $_GET['update'] == 1)) {
95  return false;
96  } else {
97  return true;
98  }
99  }
100 
106  function get()
107  {
108  $fp = String::fopen_utf8($this->file, 'rb');
109  if ($fp) {
110  @flock($fp, LOCK_SH);
111  clearstatcache(); // Les résultats de la fonction filesize() sont mis en cache.
112  $content = @fread($fp, @filesize($this->file));
113  @flock($fp, LOCK_UN);
114  @fclose($fp);
115  $key = String::substr($content, 0, 32);
116  $data = String::substr($content, 32);
117  // On vérifie que la signature md5 est bien égale au contenu du fichier md5. S'ils ne correspondent
118  // pas, on modifie la date de dernière modification du fichier pour qu'il soit regénéré au prochain appel
119  if ($key != md5($data)) {
120  @touch($this->file, 0);
121  }
122  return $data;
123  }
124  return false;
125  }
126 
133  function save($data)
134  {
135  $fp = String::fopen_utf8($this->file, 'wb');
136  if ($fp) {
137  @flock($fp, LOCK_EX);
138  // On utilise strlen et non pas String::strlen car on veut le nombre d'octets et non pas de caractères
139  @fwrite($fp, md5($data) . $data, 32 + strlen($data));
140  @flock($fp, LOCK_UN);
141  @fclose($fp);
142  return true;
143  }
144  }
145 
151  function echo_headers($lifeTime = 7200)
152  {
153  header('Cache-Control: public');
154  header('Pragma:');
155  if(!empty($this->filemtime)) {
156  $filemtime = $this->filemtime;
157  } else {
158  $filemtime = time();
159  }
160  header('Last-Modified: '.gmdate('D, d M Y H:i:s', $filemtime).' GMT');
161  header('Expires: ' . gmdate('D, d M Y H:i:s', $filemtime + $lifeTime) . ' GMT'); // 30 days
162  }
163 
169  function delete_cache_file($clean_all_group = false)
170  {
171  clean_Cache(0, ($clean_all_group?String::substr(md5($this->cfg['group']), 0, 8) . '_':$this->file));
172  }
173 }
174 
$cfg
Definition: Cache.php:34
foreach(array('date1', 'date2', 'type', 'renewals', 'width') as $item) $data
Definition: chart-data.php:29
clean_Cache($days_max=15, $filename_beginning=null)
Suppression des anciens fichiers de cache.
Definition: fonctions.php:3917
testDate($lifeDate)
Cache::testDate()
Definition: Cache.php:92
static fopen_utf8($filename, $mode, $force_filename_in_iso_8859=false, $try_filename_in_iso_8859_if_file_not_found=true)
Ouvre un fichier.
Definition: String.php:793
echo_headers($lifeTime=7200)
Cache::echo_headers()
Definition: Cache.php:151
$filemtime
Definition: Cache.php:30
testTime($lifeTime=7200, $update_timestamp_now=false)
Teste la validité d'un fichier de cache.
Definition: Cache.php:66
save($data)
Cache::save()
Definition: Cache.php:133
$GLOBALS['page_columns_count']
delete_cache_file($clean_all_group=false)
Cache::delete_cache_file()
Definition: Cache.php:169
Cache($id, $cfg=array())
Cache::Cache()
Definition: Cache.php:42
$id
Definition: articles.php:22
static substr($string, $start, $length=null)
Returns the portion of string specified by the start and length parameters.
Definition: String.php:112
Definition: Cache.php:27
$file
Definition: Cache.php:29

This documentation for Open ecommerce PEEL Shopping and PEEL.fr has been generated by Doxygen on Thu Oct 15 2015 14:29:55 - Peel ecommerce is a product of Agence web Advisto SAS. All rights reserved.