From e39f6e5b05da98fa44ab3421467b777fbe89e8db Mon Sep 17 00:00:00 2001
From: Antoine Pitrou <pitrou@free.fr>
Date: Sat, 9 Nov 2002 22:13:58 +0000
Subject: [PATCH] ecriture plus intelligente (?) du cache

---
 ecrire/inc_db_mysql.php3 |  3 +--
 ecrire/inc_version.php3  |  4 ++--
 inc-cache.php3           | 33 ++++++++++++++++++++++++++++-----
 inc-public-global.php3   | 29 ++++-------------------------
 4 files changed, 35 insertions(+), 34 deletions(-)

diff --git a/ecrire/inc_db_mysql.php3 b/ecrire/inc_db_mysql.php3
index 2ec2022c79..ca8559aa78 100644
--- a/ecrire/inc_db_mysql.php3
+++ b/ecrire/inc_db_mysql.php3
@@ -56,8 +56,7 @@ function traite_query($query) {
 	$query = ereg_replace('([[:space:],])spip_', '\1'.$GLOBALS['table_prefix'].'_', $query) . $suite;
 
 	// supprimer les INSERT DELAYED
-	if (! $GLOBALS['flag_mysql_delayed'])
-		$query = ereg_replace('^INSERT DELAYED ', 'INSERT ', $query);
+	$query = ereg_replace('^INSERT DELAYED ', 'INSERT ', $query);
 
 	return $query;
 }
diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3
index 6a1611aa1d..56c3f8ee24 100644
--- a/ecrire/inc_version.php3
+++ b/ecrire/inc_version.php3
@@ -74,8 +74,6 @@ $flag_strpos_3 = (@strpos('baba', 'a', 2) == 3);
 $flag_get_cfg_var = (@get_cfg_var('error_reporting') != "");
 $flag_strtr2 = ($php_version_maj > 3);
 
-$flag_mysql_delayed = false;	// tant qu'on ne sait pas detecter si les INSERT DELAYED sont autorises...
-
 if ($flag_function_exists) {
 	$flag_ini_get = (function_exists("ini_get")
 		&& (@ini_get('max_execution_time') > 0));	// verifier pas desactivee
@@ -91,6 +89,7 @@ if ($flag_function_exists) {
 	$flag_sapi_name = function_exists("php_sapi_name");
 	$flag_utf8_decode = function_exists("utf8_decode");
 	$flag_ldap = function_exists("ldap_connect");
+	$flag_flock = function_exists("flock");
 }
 else {
 	$flag_ini_get = false;
@@ -104,6 +103,7 @@ else {
 	$flag_sapi_name = false;
 	$flag_utf8_decode = false;
 	$flag_ldap = false;
+	$flag_flock = false;
 }
 
 
diff --git a/inc-cache.php3 b/inc-cache.php3
index d69d2c105b..5e9fdd2063 100644
--- a/inc-cache.php3
+++ b/inc-cache.php3
@@ -12,23 +12,23 @@ define("_INC_CACHE", "1");
 
 function generer_nom_fichier_cache($fichier_requete) {
 	$md_cache = md5($fichier_requete);
-	
+
 	$fichier_cache = ereg_replace('^/+', '', $fichier_requete);
 	$fichier_cache = ereg_replace('\.[a-zA-Z0-9]*', '', $fichier_cache);
 	$fichier_cache = ereg_replace('&[^&]+=([^&]+)', '&\1', $fichier_cache);
 	$fichier_cache = rawurlencode(strtr($fichier_cache, '/&-', '--_'));
 	if (strlen($fichier_cache) > 24)
 		$fichier_cache = substr(ereg_replace('([a-zA-Z]{1,3})[^-]*-', '\1-', $fichier_cache), -24);
-	
+
 	if (!$fichier_cache)
 		$fichier_cache = 'INDEX-';
 	$fichier_cache .= '.'.substr($md_cache, 1, 6);
-	
+
 	$subdir_cache = substr($md_cache, 0, 1);
-	
+
 	if (creer_repertoire("CACHE", $subdir_cache))
 		$fichier_cache = "$subdir_cache/$fichier_cache";
-	
+
 	return $fichier_cache;
 }
 
@@ -69,6 +69,29 @@ function utiliser_cache($chemin_cache, $delais) {
 }
 
 
+function ecrire_fichier_cache($fichier, $contenu) {
+	global $flag_flock;
+
+	$fichier_tmp = $fichier.'_tmp';
+	$f = fopen($fichier_tmp, "wb");
+	if (!$f) return;
+
+	// Essayer de poser un verrou
+	if ($flag_flock) {
+		@flock($f, 6, $r);
+		if ($r) return;
+	}
+	$r = fwrite($f, $contenu);
+	if ($flag_flock) @flock($f, 3);
+	if ($r != strlen($contenu)) return;
+	if (!fclose($f)) return;
+
+	@unlink($fichier);
+	rename($fichier_tmp, $fichier);
+	if ($GLOBALS['flag_apc']) apc_rm($fichier);
+}
+
+
 //
 // Retourne true si le sous-repertoire peut etre cree, false sinon
 //
diff --git a/inc-public-global.php3 b/inc-public-global.php3
index dd0f4cf9ed..52ca946bd6 100644
--- a/inc-public-global.php3
+++ b/inc-public-global.php3
@@ -10,12 +10,6 @@ include_local ("inc-cache.php3");
 //
 
 function inclure_fichier($fond, $delais, $contexte_inclus = "") {
-	static $seed = 0;
-	if (!$seed) {
-		$seed = (double) (microtime() + 1) * time();
-		srand($seed);
-	}
-
 	$fichier_requete = $fond;
 	if (is_array($contexte_inclus)) {
 		reset($contexte_inclus);
@@ -31,13 +25,8 @@ function inclure_fichier($fond, $delais, $contexte_inclus = "") {
 		$fond = chercher_squelette($fond, $contexte_inclus['id_rubrique']);
 		$page = calculer_page($fond, $contexte_inclus);
 		if ($page) {
-			if ($GLOBALS['flag_apc']) {
-				apc_rm($chemin_cache);
-			}
 			spip_log("calcul($delais): $chemin_cache");
-			$f = fopen($chemin_cache, "wb");
-			fwrite($f, $page);
-			fclose($f);
+			ecrire_fichier_cache($chemin_cache, $texte);
 		}
 	}
 	return $chemin_cache;
@@ -61,7 +50,7 @@ $use_cache = utiliser_cache($chemin_cache, $delais);
 if ($use_cache AND file_exists("ecrire/inc_meta_cache.php3")) {
 	include_ecrire("inc_meta_cache.php3");
 }
-if (! defined("_ECRIRE_INC_META_CACHE")) {
+if (!defined("_ECRIRE_INC_META_CACHE")) {
 	include_ecrire("inc_meta.php3");
 }
 
@@ -114,13 +103,8 @@ if (!$use_cache) {
 
 			$texte = "<"."?php @header (\"Location: $url\"); ?".">";
 			$calculer_cache = false;
-			if ($GLOBALS['flag_apc']) {
-				apc_rm($chemin_cache);
-			}
 			spip_log("redirection: $url");
-			$file = fopen($chemin_cache, "wb");
-			fwrite($file, $texte);
-			fclose($file);
+			ecrire_fichier_cache($chemin_cache, $texte);
 		}
 	}
 
@@ -128,13 +112,8 @@ if (!$use_cache) {
 		include_local ("inc-calcul.php3");
 		$page = calculer_page_globale($fond);
 		if ($page) {
-			if ($GLOBALS['flag_apc']) {
-				apc_rm($chemin_cache);
-			}
 			spip_log("calcul($delais): $chemin_cache");
-			$file = fopen($chemin_cache, "wb");
-			fwrite($file, $page);
-			fclose($file);
+			ecrire_fichier_cache($chemin_cache, $page);
 		}
 	}
 }
-- 
GitLab