PageRenderTime 26ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/_plugins_/cache_cool/cache_cool_options.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 258 lines | 152 code | 20 blank | 86 comment | 24 complexity | e2f4673236535fc89adf871a71778593 MD5 | raw file
  1. <?php
  2. /*
  3. * Plugin Cache Cool
  4. * (c) 2009 Cedric
  5. * Distribue sous licence GPL
  6. *
  7. */
  8. if (!defined("_ECRIRE_INC_VERSION")) return;
  9. // si deja un buffer avec une sortie on ne peut plus se lancer pour forcer le flush
  10. if ($cache_cool_oblevel=ob_get_level()
  11. AND $cache_cool_oblength=ob_get_length()){
  12. spip_log("previous ob : $cache_cool_oblevel / previous length: $cache_cool_oblength",'cachecool'._LOG_DEBUG);
  13. }
  14. else {
  15. spip_log("starting ob",'cachecool'._LOG_DEBUG);
  16. ob_start("cache_cool_flush");
  17. }
  18. /**
  19. * Fonction chargee de produire le cache pour un contexte et un fond donne
  20. * et de le memoriser si besoin
  21. *
  22. * S'insere a la place de la fonction du core public_produire_page_dist pour
  23. * decider si le cache existant peut etre servi froid, et lancer dans la queue
  24. * une tache de mise a jour du cache en cron
  25. *
  26. * Dans ce cas, on reentre ici avec $use_cache.
  27. * On verifie que le contexte produit un $use_cache et un $chemin_cache credibles
  28. * (si on est dans l'espace prive au moment du calcul differe, aucun cache ne sera demande)
  29. * Il faudrait idealement verifier qu'on retrouve le meme $chemin_cache
  30. * mais cela necessiterait d'avoir le $page et le $contexte qui utilises pour cela
  31. * dans le cas de la page principal dans public/assembler, mais qui ne sont pas fournis ici
  32. *
  33. * Si le contexte est semblable, on lance le calcul et la mise a jour du cache,
  34. * sinon on reprogramme avec les memes arguments
  35. *
  36. * @param string $fond
  37. * @param array $contexte
  38. * @param int $use_cache
  39. * @param string $chemin_cache
  40. * @param array $contexte_cache
  41. * @param array $page
  42. * @param int $lastinclude
  43. * @param string $connect
  44. * @return array
  45. */
  46. function public_produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte_cache, $page, &$lastinclude, $connect='', $global_context=null, $init_time = null){
  47. static $processing = false;
  48. $background = false;
  49. // calcul differe du cache ?
  50. // prend la main si
  51. // - c'est un calcul normal avec mise en cache
  52. // - un cache existe deja qui peut etre servi
  53. // - c'est une visite anonyme (cache mutualise)
  54. // - on est pas deja en train de traiter un calcul en background
  55. if ($use_cache==1 AND $chemin_cache
  56. AND is_array($page) AND isset($page['texte'])
  57. AND !$GLOBALS['visiteur_session']['id_auteur']
  58. AND !$processing
  59. ) {
  60. // si c'est un bot, on ne lance pas un calcul differe
  61. // ca ne sert qu'a remplir la queue qui ne sera pas videe par le bot (pas de cron)
  62. // mais on lui sert le cache froid tout de meme
  63. if (!defined('_IS_BOT') OR !_IS_BOT){
  64. // on differe la maj du cache et on affiche le contenu du cache ce coup ci encore
  65. $where = is_null($contexte_cache)?"principal":"inclure_page";
  66. // on reprogramme avec un $use_cache=2 qui permettra de reconnaitre ces calculs
  67. $args = array($fond, $contexte, 2, $chemin_cache, $contexte_cache, array('contexte_implicite'=>$page['contexte_implicite']), $lastinclude, $connect, cache_cool_get_global_context(), $_SERVER['REQUEST_TIME']);
  68. // mode de fonctionnement de cache_cool : QUEUE ou MEMORY
  69. if (!defined('_CACHE_COOL_MODE')) define('_CACHE_COOL_MODE','QUEUE');
  70. if (_CACHE_COOL_MODE=="QUEUE"){
  71. job_queue_add('public_produire_page',$c="Calcul du cache $fond [$where]",$args,"",TRUE);
  72. }
  73. else {
  74. if (!is_array($GLOBALS['cache_cool_queue'])){
  75. register_shutdown_function("cache_cool_process");
  76. $GLOBALS['cache_cool_queue'] = array();
  77. }
  78. $GLOBALS['cache_cool_queue'][] = $args;
  79. }
  80. spip_log("au frigo : $fond [$where]",'cachecool'._LOG_DEBUG);
  81. }
  82. gunzip_page($page); // decomprimer la page si besoin
  83. #spip_log($c,'cachedelai');
  84. return $page;
  85. }
  86. // si c'est un cacul differe, verifier qu'on est dans le bon contexte
  87. if ($use_cache==2){
  88. if ($cacher = charger_fonction('cacher','public', true)){
  89. // le nom de chemin genere ici est ignore car faux
  90. // mais il faut que l'appel produise bien un chemin
  91. // sinon pb de contexte
  92. $cacher(is_null($contexte_cache)?array():$contexte_cache, $use_cache, $chemin2, $page, $lastmodified);
  93. }
  94. else
  95. $use_cache = -1;
  96. if (intval($use_cache)!==1 OR !$chemin2){
  97. @define('_CACHE_COOL_ABORT_DELAI',600);
  98. if (
  99. ($use_cache!=0) // le cache a deja ete mis a jour !
  100. AND ($elapsed = time()-$init_time)<_CACHE_COOL_ABORT_DELAI // cette demande est moisie
  101. ){
  102. // on n'est pas dans le bon contexte, il faut se reprogrammer !
  103. $where = is_null($contexte_cache)?"principal":"inclure_page";
  104. $args = func_get_args();
  105. job_queue_add('public_produire_page',$c="[Re$elapsed] Calcul du cache $fond [$where]",$args,"",TRUE);
  106. #spip_log($c,'cachedelai');
  107. }
  108. return;
  109. }
  110. if (!$processing)
  111. $processing = $background = true;
  112. }
  113. // positionner le contexte des globales si necessaire
  114. if (!is_null($global_context))
  115. cache_cool_global_context($global_context);
  116. include_spip('public/assembler');
  117. $page = public_produire_page_dist($fond, $contexte, $use_cache, $chemin_cache, $contexte_cache, $page, $lastinclude, $connect);
  118. // restaurer le contexte des globales si necessaire
  119. if (!is_null($global_context))
  120. cache_cool_global_context(false);
  121. if ($background) $processing = false;
  122. return $page;
  123. }
  124. function cache_cool_flush($content){
  125. header("Content-Length: ".($l=ob_get_length()));
  126. header("Connection: close");
  127. spip_log("Connection: close (length $l)",'cachecool'._LOG_DEBUG);
  128. return $content;
  129. }
  130. function cache_cool_process(){
  131. // forcer le flush des tampons pas envoyes (complete le content-length/conection:close envoye dans cache_cool_flush)
  132. ob_end_flush();
  133. flush();
  134. if (function_exists('fastcgi_finish_request'))
  135. fastcgi_finish_request();
  136. // se remettre dans le bon dossier, car Apache le change parfois (toujours?)
  137. chdir(_ROOT_CWD);
  138. while (is_array($GLOBALS['cache_cool_queue'])
  139. AND $args = array_shift($GLOBALS['cache_cool_queue'])){
  140. spip_log("calcul en fin de hit public_produire_page($args[0],$args[1],$args[2],$args[3],$args[4],$args[5],$args[6],$args[7],$args[8],$args[9])",'cachecool'._LOG_DEBUG);
  141. public_produire_page($args[0],$args[1],$args[2],$args[3],$args[4],$args[5],$args[6],$args[7],$args[8],$args[9]);
  142. }
  143. }
  144. // en SPIP 3 le test de doublon sur f_jQuery a ete supprime,
  145. // plus la peine de surcharger
  146. if (intval($GLOBALS['spip_version_branche'])<3){
  147. $GLOBALS['spip_pipeline']['insert_head'] = str_replace('|f_jQuery','|cache_cool_f_jQuery',$GLOBALS['spip_pipeline']['insert_head']);
  148. // Inserer jQuery sans test de doublon
  149. // incompatible avec le calcul multiple de squelettes sur un meme hit
  150. // http://doc.spip.org/@f_jQuery
  151. function cache_cool_f_jQuery ($texte) {
  152. $x = '';
  153. foreach (pipeline('jquery_plugins',
  154. array(
  155. 'javascript/jquery.js',
  156. 'javascript/jquery.form.js',
  157. 'javascript/ajaxCallback.js'
  158. )) as $script)
  159. if ($script = find_in_path($script))
  160. $x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n";
  161. $texte = $x.$texte;
  162. return $texte;
  163. }
  164. }
  165. /**
  166. * Definir un nouveau contexte de globales (en sauvegardant l'ancien),
  167. * ou restaurer l'ancien contexte avec la valeur false
  168. * @staticvar array $pile
  169. * @param array/bool $push
  170. */
  171. function cache_cool_global_context($push){
  172. static $pile = array();
  173. // restaurer le contexte
  174. if ($push===false AND count($pile)) {
  175. $pull = array_shift($pile);
  176. lang_select();
  177. cache_cool_set_global_contexte($pull);
  178. }
  179. // definir un nouveau contexte
  180. else {
  181. // on empile le contexte actuel
  182. array_unshift($pile, cache_cool_get_global_context());
  183. // et on le modifie en commencant par la langue courante
  184. lang_select($push['spip_lang']);
  185. cache_cool_set_global_contexte($push);
  186. }
  187. }
  188. /**
  189. * Lire les globales utilisees implicitement dans le calcul des
  190. * squelettes, et retourner un tableau les contenant
  191. *
  192. * @return array
  193. */
  194. function cache_cool_get_global_context(){
  195. $contexte = array();
  196. foreach(array(
  197. 'spip_lang',
  198. 'visiteur_session',
  199. 'auteur_session',
  200. 'marqueur',
  201. 'dossier_squelettes',
  202. '_COOKIE',
  203. '_SERVER',
  204. '_GET',
  205. '_REQUEST',
  206. 'profondeur_url',
  207. 'REQUEST_URI',
  208. 'REQUEST_METHOD',
  209. ) as $v)
  210. $contexte[$v] = $GLOBALS[$v];
  211. $contexte['url_de_base'] = url_de_base(false);
  212. $contexte['nettoyer_uri'] = nettoyer_uri();
  213. return $contexte;
  214. }
  215. /**
  216. * Assigner les globales fournies par $c
  217. * @param array $c
  218. * @return void
  219. */
  220. function cache_cool_set_global_contexte($c){
  221. if (!is_array($c)) return; // ne rien faire
  222. // precaution : spip_lang ne peut etre affecte brutalement
  223. // il faut passer par lang_select()
  224. unset($c['spip_lang']);
  225. url_de_base($c['url_de_base']); unset($c['url_de_base']);
  226. nettoyer_uri($c['nettoyer_uri']); unset($c['nettoyer_uri']);
  227. foreach($c as $k=>$v){
  228. $GLOBALS[$k] = $v;
  229. }
  230. foreach(array(
  231. 'HTTP_SERVER_VARS'=>'_SERVER',
  232. 'HTTP_GET_VARS'=>'_GET',
  233. 'HTTP_COOKIE_VARS'=>'_COOKIE',
  234. ) as $k1=>$k2){
  235. $GLOBALS[$k1] = $GLOBALS[$k2];
  236. }
  237. }
  238. ?>