/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2014 *
+ * Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
}
// 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;
}
// 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
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
@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);
$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 :
// 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;
}
}