X-Git-Url: http://git.cyclocoop.org/?p=ptitvelo%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fqueue.php;fp=www%2Fecrire%2Finc%2Fqueue.php;h=7fa78cd93cb3f994993f4db419b49e6a819f9573;hp=2639568851d2c6e08a770d2c9bf0445aca3bccde;hb=d18fcb8f27a4016e3fa7b50a9b2255d529dca543;hpb=e847eea4a82a7396dd0abf860f9b30d654f38629 diff --git a/www/ecrire/inc/queue.php b/www/ecrire/inc/queue.php index 2639568..7fa78cd 100644 --- a/www/ecrire/inc/queue.php +++ b/www/ecrire/inc/queue.php @@ -278,7 +278,7 @@ function queue_schedule($force_jobs = null){ } // rien a faire si le prochain job est encore dans le futur - if (queue_sleep_time_to_next_job() AND (!$force_jobs OR !count($force_jobs))){ + if (queue_sleep_time_to_next_job()>0 AND (!$force_jobs OR !count($force_jobs))){ spip_log("queue_sleep_time_to_next_job",'jq'._LOG_DEBUG); return; } @@ -477,7 +477,7 @@ function queue_set_next_job_time($next) { // toujours relire la valeur pour comparer, pour tenir compte des maj concourrantes // et ne mettre a jour que si il y a un interet a le faire // permet ausis d'initialiser le nom de fichier a coup sur - $curr_next = $_SERVER['REQUEST_TIME'] + queue_sleep_time_to_next_job(true); + $curr_next = $_SERVER['REQUEST_TIME'] + max(0,queue_sleep_time_to_next_job(true)); if ( ($curr_next<=$time AND $next>$time) // le prochain job est dans le futur mais pas la date planifiee actuelle OR $curr_next>$next // le prochain job est plus tot que la date planifiee actuelle @@ -505,8 +505,9 @@ function queue_set_next_job_time($next) { function queue_affichage_cron(){ $texte = ""; + $time_to_next = queue_sleep_time_to_next_job(); // rien a faire si le prochain job est encore dans le futur - if (queue_sleep_time_to_next_job() OR defined('_DEBUG_BLOCK_QUEUE')) + if ($time_to_next>0 OR defined('_DEBUG_BLOCK_QUEUE')) return $texte; // ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent @@ -515,6 +516,11 @@ function queue_affichage_cron(){ @touch($lock); // il y a des taches en attentes + // si depuis plus de 5min, on essaye de lancer le cron par tous les moyens pour rattraper le coup + // on est sans doute sur un site qui n'autorise pas http sortant ou avec peu de trafic + $urgent = false; + if ($time_to_next<-300) + $urgent = true; $url_cron = generer_url_action('cron','',false,true); @@ -544,13 +550,25 @@ function queue_affichage_cron(){ $errno, $errstr, 1); if ($fp) { + $timeout = 200; // ms + stream_set_timeout($fp,0,$timeout * 1000); $query = $parts['path'].($parts['query']?"?".$parts['query']:""); $out = "GET ".$query." HTTP/1.1\r\n"; $out.= "Host: ".$parts['host']."\r\n"; $out.= "Connection: Close\r\n\r\n"; fwrite($fp, $out); + spip_timer('read'); + $t = 0; + // on lit la reponse si possible pour fermer proprement la connexion + // avec un timeout total de 200ms pour ne pas se bloquer + while (!feof($fp) AND $t<$timeout) { + @fgets($fp, 1024); + $t += spip_timer('read',true); + spip_timer('read'); + } fclose($fp); - return $texte; + if (!$urgent) + return $texte; } } // si fsockopen n'est pas dispo on essaye cURL : @@ -562,12 +580,13 @@ function queue_affichage_cron(){ // cf bug : http://www.php.net/manual/en/function.curl-setopt.php#104597 curl_setopt($ch, CURLOPT_NOSIGNAL, 1); // valeur mini pour que la requete soit lancee - curl_setopt($ch, CURLOPT_TIMEOUT_MS, 100); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); // lancer curl_exec($ch); // fermer curl_close($ch); - return $texte; + if (!$urgent) + return $texte; } }