Changeset 70165 in spip-zone


Ignore:
Timestamp:
Feb 24, 2013, 7:41:03 PM (7 years ago)
Author:
cedric@…
Message:

en mode MEMORY, éviter de fermer la connection en cours si on dispose du plugin memoization (et si les requetes http sont permises par l'hebergeur)
Pour cela on prefere lancer un hit async pour calculer les caches mis a frigo pendant le hit ; la liste des caches a calculer est stockee dans une variable memoizee dont seul l'id est passee a l'action.

Location:
_plugins_/cache_cool
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/cache_cool/cache_cool_options.php

    r70149 r70165  
    135135        // (mais dommage car on perd le benefice de KeepAlive=on)
    136136        if (is_array($GLOBALS['cache_cool_queue']) AND $n=count($GLOBALS['cache_cool_queue'])){
    137                 header("X-Cache-Cool: $n");
    138                 header("Content-Length: ".($l=ob_get_length()));
    139                 header("Connection: close");
    140                 spip_log("Connection: close (length $l)",'cachecool'._LOG_DEBUG);
     137                $close = true;
     138                if (defined('_DIR_PLUGIN_MEMOIZATION')){
     139                        #spip_log('meta cache_cool_action_refresh : '.$GLOBALS['meta']['cache_cool_action_refresh'],'cachecool'._LOG_DEBUG);
     140                        if (!isset($GLOBALS['meta']['cache_cool_action_refresh']) OR $GLOBALS['meta']['cache_cool_action_refresh']<$_SERVER['REQUEST_TIME']-86400){
     141                                if (!isset($GLOBALS['meta']['cache_cool_action_refresh_test']) OR $GLOBALS['meta']['cache_cool_action_refresh_test']<$_SERVER['REQUEST_TIME']-86400){
     142                                        ecrire_meta('cache_cool_action_refresh_test',$_SERVER['REQUEST_TIME']);
     143                                        $url = generer_url_action('cache_cool_refresh','',true);
     144                                        if (strncmp($url,'http',4)!==0){
     145                                                if (!function_exists('url_absolue')) include_spip('inc/filtres_mini');
     146                                                $url = url_absolue($url);
     147                                        }
     148                                        cache_cool_async_curl($url);
     149                                        spip_log("Test mise a jour cache async $url",'cachecool'._LOG_DEBUG);
     150                                }
     151                        }
     152                        else{
     153                                if (!function_exists('cache_set')) include_spip('inc/memoization');
     154                                $id = md5($GLOBALS['ip'].self().@getmypid().time().serialize($GLOBALS['visiteur_session']));
     155                                if (cache_set("cachecool-$id",$GLOBALS['cache_cool_queue'])){
     156                                        $url = generer_url_action('cache_cool_refresh',"id=$id",true);
     157                                        if (strncmp($url,'http',4)!==0){
     158                                                if (!function_exists('url_absolue')) include_spip('inc/filtres_mini');
     159                                                $url = url_absolue($url);
     160                                        }
     161                                        if (cache_cool_async_curl($url)){
     162                                                unset($GLOBALS['cache_cool_queue']);
     163                                                $close = false;
     164                                                spip_log("Mise a jour $n cache lancee en async sur $url",'cachecool'._LOG_DEBUG);
     165                                        }
     166                                }
     167                                else
     168                                        spip_log("cache_set('cachecool-$id') return false",'cachecool');
     169                        }
     170                }
     171                if ($close){
     172                        header("X-Cache-Cool: $n");
     173                        header("Content-Length: ".($l=ob_get_length()));
     174                        header("Connection: close");
     175                        spip_log("Connection: close (length $l) ($n cache a calculer)",'cachecool'._LOG_DEBUG);
     176                }
    141177        }
    142178        return $content;
    143179}
    144180
    145 function cache_cool_process(){
    146         // forcer le flush des tampons pas envoyes (complete le content-length/conection:close envoye dans cache_cool_flush)
    147         ob_end_flush();
    148         flush();
    149         if (function_exists('fastcgi_finish_request'))
    150                 fastcgi_finish_request();
    151 
    152   // se remettre dans le bon dossier, car Apache le change parfois (toujours?)
    153         chdir(_ROOT_CWD);
    154 
    155         while (is_array($GLOBALS['cache_cool_queue'])
    156                 AND $args = array_shift($GLOBALS['cache_cool_queue'])){
    157                 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);
    158                 public_produire_page($args[0],$args[1],$args[2],$args[3],$args[4],$args[5],$args[6],$args[7],$args[8],$args[9]);
     181function cache_cool_process($force=false){
     182        if (isset($GLOBALS['cache_cool_queue']) AND is_array($GLOBALS['cache_cool_queue'])){
     183          // se remettre dans le bon dossier, car Apache le change parfois (toujours?)
     184                chdir(_ROOT_CWD);
     185                if (!$force){
     186                        $flush_level = ob_get_level();
     187                        // forcer le flush des tampons pas envoyes (declenche le content-length/conection:close envoye dans cache_cool_flush)
     188                        while ($flush_level--) ob_end_flush();
     189                        flush();
     190                        if (function_exists('fastcgi_finish_request'))
     191                                fastcgi_finish_request();
     192                }
     193
     194                while (is_array($GLOBALS['cache_cool_queue'])
     195                        AND $args = array_shift($GLOBALS['cache_cool_queue'])){
     196                        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);
     197                        public_produire_page($args[0],$args[1],$args[2],$args[3],$args[4],$args[5],$args[6],$args[7],$args[8],$args[9]);
     198                }
    159199        }
    160200}
     
    261301        }
    262302}
     303
     304function cache_cool_async_curl($url){
     305        // Si fsockopen est possible, on lance l'url via un socket
     306        // en asynchrone
     307        if(function_exists('fsockopen')){
     308                $parts=parse_url($url);
     309                $fp = @fsockopen($parts['host'],isset($parts['port'])?$parts['port']:80,$errno, $errstr, 30);
     310                if ($fp) {
     311                        $query = $parts['path'].($parts['query']?"?".$parts['query']:"");
     312                        $out = "GET ".$query." HTTP/1.1\r\n";
     313                        $out.= "Host: ".$parts['host']."\r\n";
     314                        $out.= "Connection: Close\r\n\r\n";
     315                        fwrite($fp, $out);
     316                        fclose($fp);
     317                        return true;
     318                }
     319        }
     320
     321        // ici lancer le cron par un CURL asynchrone si CURL est present
     322        if (function_exists("curl_init")){
     323                //setting the curl parameters.
     324                $ch = curl_init($url);
     325                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     326                // cf bug : http://www.php.net/manual/en/function.curl-setopt.php#104597
     327                curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
     328                // valeur mini pour que la requete soit lancee
     329                curl_setopt($ch, CURLOPT_TIMEOUT_MS, 100);
     330                curl_exec($ch);
     331                curl_close($ch);
     332                return true;
     333        }
     334        return false;
     335}
    263336?>
  • _plugins_/cache_cool/plugin.xml

    r70149 r70165  
    22        <nom>Cache Cool</nom>
    33        <auteur>[Cedric->http://www.yterium.net]</auteur>
    4         <version>0.3.2</version>
     4        <version>0.4.0</version>
    55        <etat>stable</etat>
    66        <icon>images/cache_cool-128.png</icon>
Note: See TracChangeset for help on using the changeset viewer.