Skip to content
Extraits de code Groupes Projets
Valider 635f00a6 rédigé par Fil's avatar Fil
Parcourir les fichiers

retour à un flock() moins improbable

parent e9c66a33
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -5,88 +5,7 @@ ...@@ -5,88 +5,7 @@
if (defined("_ECRIRE_INC_FLOCK")) return; if (defined("_ECRIRE_INC_FLOCK")) return;
define("_ECRIRE_INC_FLOCK", "1"); define("_ECRIRE_INC_FLOCK", "1");
// flock() marche dans ce repertoire <=> j'ai le droit de flock() sur ce fichier
if (LOCK_UN!=3) {
define ('LOCK_SH', 1);
define ('LOCK_EX', 2);
define ('LOCK_UN', 3);
define ('LOCK_NB', 4);
}
function test_flock ($fichier, $ecriture = false) {
static $flock = array();
global $flag_flock;
if (!$flag_flock)
return false;
preg_match('|(.*)/([^/]*)$|', $fichier, $match);
$dir = $match[1];
if ($dir == '')
return false; // a la racine on ne fait que lire
// premier appel pour ce $dir ?
if (!isset($flock[$dir])) {
// si un fichier d'etat flock est la et pas trop vieux -- id est:
// pas recopie depuis une autre installation ! -- c'est ok.
if (@file_exists("$dir/.flock_ok")
AND (filemtime("$dir/.flock_ok") > time() - 3600))
$flock[$dir] = true;
else if (@file_exists("$dir/.flock_naze")
AND (filemtime("$dir/.flock_naze") > time() - 3600))
$flock[$dir] = false;
// pas d'infos de flock, on va tester
// MAIS attention on ne veut effectivement
// tester que les repertoires dans lesquels on ecrit
// Si on ne fait qu'y lire, pas necessaire (et pas
// forcement autorise)
else if ($ecrire) {
$fichiertest = $dir.'/'
.substr(uniqid(@getmypid(), true),-6).".tmp";
if ($fp = @fopen($fichiertest, 'w')) {
if (@flock($fp, LOCK_SH)) {
@flock($fp, LOCK_UN);
$flock[$dir] = true;
@touch("$dir/.flock_ok");
@unlink("$dir/.flock_naze");
@fclose($fp);
spip_log("test $dir: flock ok");
} else {
$flock[$dir] = false;
@touch("$dir/.flock_naze");
@unlink("$dir/.flock_ok");
spip_log("test $dir: flock naze");
}
@unlink($fichiertest);
} else {
spip_log("test $dir: echec du test sur $fichiertest !");
@touch("$dir/.flock_naze");
@unlink("$dir/.flock_ok");
}
} else
$flock[$dir] = false;
}
return $flock[$dir];
}
// Si flock ne marche pas dans ce repertoire ou chez cet hebergeur,
// on renvoie OK pour ne pas bloquer
function spip_flock($filehandle, $mode, $fichier, $ecriture = false) {
if (!test_flock($fichier, $ecriture))
return true;
$r = flock($filehandle, $mode);
// demande de verrou ==> risque de sleep ==> forcer la relecture de l'etat
if ($mode == LOCK_EX)
clearstatcache();
return $r;
}
function spip_file_get_contents ($fichier) { function spip_file_get_contents ($fichier) {
if (substr($fichier, -3) != '.gz') { if (substr($fichier, -3) != '.gz') {
if (function_exists('file_get_contents') if (function_exists('file_get_contents')
AND $GLOBALS['os_serveur'] !='windows') # windows retourne '' AND $GLOBALS['os_serveur'] !='windows') # windows retourne ''
...@@ -95,7 +14,6 @@ function spip_file_get_contents ($fichier) { ...@@ -95,7 +14,6 @@ function spip_file_get_contents ($fichier) {
return join('', @file($fichier)); return join('', @file($fichier));
} else } else
return join('', @gzfile($fichier)); return join('', @gzfile($fichier));
} }
// options = array( // options = array(
...@@ -111,7 +29,7 @@ function lire_fichier ($fichier, &$contenu, $options=false) { ...@@ -111,7 +29,7 @@ function lire_fichier ($fichier, &$contenu, $options=false) {
if ($fl = @fopen($fichier, 'r')) { if ($fl = @fopen($fichier, 'r')) {
// verrou lecture // verrou lecture
while (!spip_flock($fl, LOCK_SH, $fichier)); @flock($fl, LOCK_SH);
// a-t-il ete supprime par le locker ? // a-t-il ete supprime par le locker ?
if (!@file_exists($fichier)) { if (!@file_exists($fichier)) {
...@@ -123,7 +41,7 @@ function lire_fichier ($fichier, &$contenu, $options=false) { ...@@ -123,7 +41,7 @@ function lire_fichier ($fichier, &$contenu, $options=false) {
$contenu = spip_file_get_contents($fichier); $contenu = spip_file_get_contents($fichier);
// liberer le verrou // liberer le verrou
spip_flock($fl, LOCK_UN, $fichier); @flock($fl, LOCK_UN);
@fclose($fl); @fclose($fl);
// Verifications // Verifications
...@@ -158,7 +76,7 @@ function ecrire_fichier ($fichier, $contenu) { ...@@ -158,7 +76,7 @@ function ecrire_fichier ($fichier, $contenu) {
// verrouiller le fichier destination // verrouiller le fichier destination
if ($fp = @fopen($fichier, 'a')) if ($fp = @fopen($fichier, 'a'))
while (!spip_flock($fp, LOCK_EX, $fichier, 'ecriture')); @flock($fp, LOCK_EX);
else else
return false; return false;
...@@ -176,7 +94,7 @@ function ecrire_fichier ($fichier, $contenu) { ...@@ -176,7 +94,7 @@ function ecrire_fichier ($fichier, $contenu) {
#spip_log("$fputs $fichier ".spip_timer('ecrire_fichier')); #spip_log("$fputs $fichier ".spip_timer('ecrire_fichier'));
// liberer le verrou et fermer le fichier // liberer le verrou et fermer le fichier
spip_flock($fp, LOCK_UN, $fichier); @flock($fp, LOCK_UN);
@fclose($fp); @fclose($fp);
return $ok; return $ok;
...@@ -190,22 +108,17 @@ function supprimer_fichier($fichier) { ...@@ -190,22 +108,17 @@ function supprimer_fichier($fichier) {
return; return;
// verrouiller le fichier destination // verrouiller le fichier destination
if ($flock = test_flock($fichier, 'ecriture')) { if ($fp = @fopen($fichier, 'a'))
if ($fp = @fopen($fichier, 'a')) @flock($fp, LOCK_EX);
while (!spip_flock($fp, LOCK_EX, $fichier)); else
else return;
return;
}
// supprimer // supprimer
@unlink($fichier); @unlink($fichier);
// liberer le verrou
if ($flock) {
spip_flock($fp, LOCK_UN, $fichier);
@fclose($fp);
}
// liberer le verrou
@flock($fp, LOCK_UN);
@fclose($fp);
} }
?> ?>
...@@ -62,7 +62,7 @@ function retire_cache($cache) { ...@@ -62,7 +62,7 @@ function retire_cache($cache) {
if (preg_match( if (preg_match(
"|^CACHE(/[0-9a-f])?(/[0-9]+)?/[^.][\-_\%0-9a-z]+\.[0-9a-f]+(\.gz)?$|i", "|^CACHE(/[0-9a-f])?(/[0-9]+)?/[^.][\-_\%0-9a-z]+\.[0-9a-f]+(\.gz)?$|i",
$cache)) { $cache)) {
// supprimer le fichier (avec spip_flock) // supprimer le fichier (de facon propre)
supprimer_fichier($cache); supprimer_fichier($cache);
// et le fichier compagnon s'il existe // et le fichier compagnon s'il existe
@unlink($cache.'.NEW'); @unlink($cache.'.NEW');
......
...@@ -127,29 +127,24 @@ function determiner_cache($delais, &$use_cache, &$chemin_cache) { ...@@ -127,29 +127,24 @@ function determiner_cache($delais, &$use_cache, &$chemin_cache) {
// Le fichier cache est-il valide ? // Le fichier cache est-il valide ?
$use_cache = utiliser_cache($chemin_cache, $delais); $use_cache = utiliser_cache($chemin_cache, $delais);
// S'il faut calculer, poser un lock SQL // Sinon, tester qu'on a la connexion a la base
if (!$use_cache) { if (!$use_cache) {
// Attendre 20 secondes maxi, que le copain ait include_ecrire('inc_connect.php3');
// calcule le meme fichier cache ou que if (!$GLOBALS['db_ok']) {
// l'invalideur ait fini de supprimer le fichier if (@file_exists($chemin_cache)) {
$ok = spip_get_lock($chemin_cache, 20); $use_cache = true;
# ici mettre plutot du spip_flock ? }
# avec le meme dans la partie invalideur ? else {
spip_log("Erreur base de donnees & "
if (!$ok) . "impossible utiliser $chemin_cache");
$use_cache = @file_exists($chemin_cache); if (!$GLOBALS['flag_preserver']) {
include_ecrire('inc_presentation.php3');
// Toujours rien ? La base est morte :-( install_debut_html(_T('info_travaux_titre'));
if (!$use_cache AND !$GLOBALS['db_ok']) { echo "<p>"._T('titre_probleme_technique')."</p>\n";
spip_log("Erreur base de donnees & install_fin_html();
impossible utiliser $chemin_cache"); }
if (!$GLOBALS['flag_preserver']) { exit;
include_ecrire('inc_presentation.php3');
install_debut_html(_T('info_travaux_titre'));
echo "<p>"._T('titre_probleme_technique')."</p>\n";
install_fin_html();
} }
exit;
} }
} }
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter