PageRenderTime 39ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/agressiveCache.php

http://opixido-ocms.googlecode.com/
PHP | 125 lines | 44 code | 15 blank | 66 comment | 13 complexity | d261f6b90327612737920aab20d5760f MD5 | raw file
Possible License(s): GPL-3.0, Apache-2.0, BSD-3-Clause, LGPL-2.1, GPL-2.0
  1. <?php
  2. /**
  3. * On utilise l'agressive cache ?
  4. */
  5. $agressiveUseCache = false;
  6. /**
  7. * Nombre de secondes avant de forcer une regénération de la page
  8. */
  9. $agressiveCacheFor = 3600 * 2;
  10. /**
  11. * Par défaut on ne met pas en cache les frontAdmin ni les actions de déconnexion de compte
  12. */
  13. $tabNoCache = array(
  14. '_action/editer', // Front admin, version de prévisu
  15. 'laLogout', // Déconnexion d'ocms_login
  16. 'jsvote' // Déconnexion d'ocms_login
  17. // ... Autres à ajouter en fonction des besoins
  18. // ... Pages avec affichage aléatoire
  19. // ... Pages avec contenu non maitrisé
  20. // ... Pages avec un contenu d'internaute
  21. );
  22. /**
  23. * Url complète de la page en cours
  24. */
  25. $url = ('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
  26. /**
  27. * Et son pendant md5 pour le fichier de cache
  28. */
  29. $agressiveFname = './include/cache_agr/page_' . md5($url);
  30. /**
  31. * On démarre hélas obligatoirement la session maintenant pour récupérer l'info de connexion ou non ...
  32. * On peut le supprimer pour les sites sans ocms_login
  33. */
  34. session_start();
  35. /**
  36. * Vérification de la présence chaque élément d'un array $arr dans un string $word
  37. *
  38. * @param array $arr
  39. * @param string $word
  40. * @return bool Le string a été trouvé ou non
  41. */
  42. function newarrayInWord($arr, $word) {
  43. while (list(, $v) = each($arr)) {
  44. if (strstr($word,$v) !== false)
  45. return true;
  46. }
  47. return false;
  48. }
  49. /**
  50. * Si on est dans une page qu'on ne doit surtout pas cacher
  51. */
  52. if (newarrayInWord($tabNoCache, $url)) {
  53. $agressiveUseCache = false;
  54. }
  55. /**
  56. * Si on cache, qu'on ne demande pas explicitement à ne pas cacher, qu'on est pas connecté, et qu'on a pas soumis de formulaire :
  57. */
  58. if ($agressiveUseCache && empty($_REQUEST['nocache']) && empty($_SESSION['ocms_login']['utilisateur_id']) && !count($_POST)) {
  59. /**
  60. * Si le fichier de cache existe déjà on continue
  61. */
  62. if (is_file($agressiveFname)) {
  63. $mtime = filemtime($agressiveFname);
  64. /**
  65. * Si le fichier de cache date de moins de $agressiveCacheFor,
  66. * et est plus récent que la dernière modification de l'admin
  67. */
  68. if ($mtime >= (time() - $agressiveCacheFor) && $mtime >= (@filemtime('./include/temoinchange'))) {
  69. /**
  70. * On définit les headers minimaux
  71. */
  72. header('Content-Type: text/html; charset=utf-8');
  73. header('Last-Modified: ' . date('r', filemtime($agressiveFname)));
  74. header('Expires: ' . date('r', filemtime($agressiveFname)+$agressiveCacheFor));
  75. /**
  76. * Une information de debug utile mais peut-être enlevée
  77. */
  78. header('X-cache: Agressive');
  79. /**
  80. * Et on retourne le fichier
  81. */
  82. readfile($agressiveFname);
  83. die();
  84. }
  85. }
  86. /**
  87. * Enregistrement dans un fichier de cache de l'ensemble de la page à la fin de sa génération
  88. */
  89. function agressiveCacheShutdown() {
  90. global $agressiveUseCache, $agressiveFname;
  91. if ($agressiveUseCache && $agressiveFname) {
  92. @file_put_contents($agressiveFname, ob_get_contents());
  93. }
  94. }
  95. /**
  96. * Appel automatique en fin de script
  97. */
  98. register_shutdown_function('agressiveCacheShutdown');
  99. /**
  100. * On commence à loggé afin de mettre en cache à la fin du script ...
  101. */
  102. ob_start();
  103. } else {
  104. /**
  105. * Sinon on utilise pas le cache et on ne met pas en cache le résultat
  106. * On pourrait tout aussi bien supprimer ce bloc
  107. * Mais comme je suis bavard ça me fait plaisir ...
  108. */
  109. $agressiveUseCache = false;
  110. }