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

L'ouverture/fermeture immédiate d'une socket pour lancer le cron en async peut...

L'ouverture/fermeture immédiate d'une socket pour lancer le cron en async peut bloquer un process apache sur le serveur, qui reste en attente betement. Il suffit alors d'avoir beaucoup de site sur un serveur pour arriver parfois à consommer le MaxClient Apache, ce qui est embêtant.
On essaye donc autant que possible de lire la réponse du serveur pour fermer proprement et libererer la connexion, en se donnant un timeout de 200ms. De temps en temps il arrivera qu'on parte comme un sauvage sans le faire, mais tant que ça reste statistiquement occasionnel c'est pas grave.
parent ee3e16a3
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+12 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -550,11 +550,22 @@ 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);
				if (!$urgent)
					return $texte;
@@ -569,7 +580,7 @@ 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