Valider 58467416 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Report de r21005 : Perf issue sur le lancement du CRON :

sur certains serveurs le firewall est réglé pour DROP silencieusement toute requete http sortante : fsockopen attends alors 30s pour lancer la requete à chaque hit avant de rendre la main. cURL lui n'attends pas mais ne sait pas que sa requete echoue. Résultat le CRON ne tourne jamais et le site a un temps de réponse catastrophique.

Fix :
- limiter le timeout de fsockopen à 1s au lieu de 30s : si on a pas pu initialiser la connexion http en 1s c'est qu'il y a un soucis
- lorsque fsockopen echoue, rien ne sert de lancer cURL qui n'aura pas plus de chance ; cURL est utilisé en fallback uniquement si fsockopen n'est pas disponible (cas rare)
- du coup si fsockopen echoue on passe au lancement old-style avec HTML background (mais ça nous a couté 1s d'attente inutile)

- si on sait qu'on est sur une telle configuration (et qu'on ne peut pas la changer) on peut inhiber le lancement du cron par fsockopen/cURL avec un
   define('_HTML_BG_CRON_FORCE',true);
   dans mes_options.php. Cela economisera l'attente inutile.
parent 60cd1647
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+38 −32
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -514,14 +514,19 @@ function queue_affichage_cron(){

	$url_cron = generer_url_action('cron','',false,true);

	// Si fsockopen est possible, on lance le cron via un socket
	// en asynchrone
	if (!defined('_HTML_BG_CRON_FORCE') OR !_HTML_BG_CRON_FORCE){

		// methode la plus rapide :
		// Si fsockopen est possible, on lance le cron via un socket en asynchrone
		// si fsockopen echoue (disponibilite serveur, firewall) on essaye pas cURL
		// car on a toutes les chances d'echouer pareil mais sans moyen de le savoir
		// on passe direct a la methode background-image
		if(function_exists('fsockopen')){
			$parts=parse_url($url_cron);

			$fp = @fsockopen($parts['host'],
		        isset($parts['port'])?$parts['port']:80,
	        $errno, $errstr, 30);
		        $errno, $errstr, 1);

			if ($fp) {
				$query = $parts['path'].($parts['query']?"?".$parts['query']:"");
@@ -533,9 +538,9 @@ function queue_affichage_cron(){
				return $texte;
			}
		}

	// ici lancer le cron par un CURL asynchrone si CURL est present
	if (function_exists("curl_init")){
		// si fsockopen n'est pas dispo on essaye cURL :
		// lancer le cron par un cURL asynchrone si cURL est present
		elseif (function_exists("curl_init")){
			//setting the curl parameters.
			$ch = curl_init($url_cron);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
@@ -549,6 +554,7 @@ function queue_affichage_cron(){
			curl_close($ch);
			return $texte;
		}
	}

	// si deja force, on retourne sans rien
	if (defined('_DIRECT_CRON_FORCE'))