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

mise en service du mode lock nfs sur les operations de fichier. Ce mode ne...

mise en service du mode lock nfs sur les operations de fichier. Ce mode ne fait que du LOCK_EX pour le moment, mais doit fonctionner avec les mutu en NFS
il est en revanche non fonctionnel sous windows. On utilise donc toujours le mode flock de php avec cet os proprietaire
Il est possible de definir son mode de lock dans mes_options avec un define :

define('_SPIP_LOCK_MODE',0); // ne pas utiliser de lock (deconseille)
define('_SPIP_LOCK_MODE',1); // utiliser le flock php (par defaut sous windows)
define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip (par defaut sauf avec windows)

clos #723, mais introduit peut etre d'autres bugs que les tests intensifs nous montreront.
il est conseille dorenavant d'utiliser spip_fopen_lock et spip_fclose_unlock en lieu et place de fopen et fclose (on rappelle neanmoins que le mieux est d'utiliser lire_fichier et ecrire_fichier)

parent cd5ade1e
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+41 −22
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -12,12 +12,41 @@


if (!defined("_ECRIRE_INC_VERSION")) return;

// http://doc.spip.org/@spip_flock
function spip_flock($handle,$verrou){
	if (_SPIP_FLOCK)
		@flock($handle, $verrou);
#define('_SPIP_LOCK_MODE',0); // ne pas utiliser de lock (deconseille)
#define('_SPIP_LOCK_MODE',1); // utiliser le flock php
#define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip

if (_SPIP_LOCK_MODE==2)
	include_spip('inc/nfslock');

$GLOBALS['liste_verrous'] = array();
function spip_fopen_lock($fichier,$mode,$verrou){
	if (_SPIP_LOCK_MODE==1){
		if ($fl = @fopen($fichier,$mode))
			// verrou
			@flock($fl, $verrou);
		return $fl;
	}
	elseif(_SPIP_LOCK_MODE==2) {
		if (($verrou = spip_nfslock($fichier)) && ($fl = @fopen($fichier,$mode))){
			$GLOBALS['liste_verrous'][$fl] = array($fichier,$verrou);
			return $fl;
		}
		else return false;
	}
	return @fopen($fichier,$mode);
}
function spip_fclose_unlock($handle){
	if (_SPIP_LOCK_MODE==1){
		@flock($handle, LOCK_UN);
	}
	elseif(_SPIP_LOCK_MODE==2) {
		spip_nfsunlock(reset($GLOBALS['liste_verrous'][$handle]),end($GLOBALS['liste_verrous'][$handle]));
		unset($GLOBALS['liste_verrous'][$handle]);
	}
	return @fclose($handle);
}


// http://doc.spip.org/@spip_file_get_contents
function spip_file_get_contents ($fichier) {
@@ -45,14 +74,10 @@ function lire_fichier ($fichier, &$contenu, $options=false) {

	#spip_timer('lire_fichier');

	if ($fl = @fopen($fichier, 'r')) {

		// verrou lecture
		spip_flock($fl, LOCK_SH);

	if ($fl = @spip_fopen_lock($fichier, 'r', LOCK_SH)) {
		// a-t-il ete supprime par le locker ?
		if (!@file_exists($fichier)) {
			@fclose($fl);
			spip_fclose_unlock($fl);
			return false;
		}

@@ -60,8 +85,7 @@ function lire_fichier ($fichier, &$contenu, $options=false) {
		$contenu = spip_file_get_contents($fichier);

		// liberer le verrou
		spip_flock($fl, LOCK_UN);
		@fclose($fl);
		spip_fclose_unlock($fl);

		// Verifications
		$ok = true;
@@ -96,8 +120,7 @@ function ecrire_fichier ($fichier, $contenu, $ecrire_quand_meme = false, $trunca
	#spip_timer('ecrire_fichier');

	// verrouiller le fichier destination
	if ($fp = @fopen($fichier, 'a')) {
		spip_flock($fp, LOCK_EX);
	if ($fp = spip_fopen_lock($fichier, 'a',LOCK_EX)) {
	// ecrire les donnees, compressees le cas echeant
	// (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage
	// de le recreer si le locker qui nous precede l'avait supprime...)
@@ -110,8 +133,7 @@ function ecrire_fichier ($fichier, $contenu, $ecrire_quand_meme = false, $trunca
		$ok = ($s == $a);

	// liberer le verrou et fermer le fichier
		spip_flock($fp, LOCK_UN);
		@fclose($fp);
		spip_fclose_unlock($fp);
		@chmod($fichier, _SPIP_CHMOD & 0666);
		if ($ok) return $ok;
	}
@@ -152,14 +174,11 @@ function supprimer_fichier($fichier, $lock=true) {

	if ($lock) {
		// verrouiller le fichier destination
		if ($fp = @fopen($fichier, 'a'))
			spip_flock($fp, LOCK_EX);
		else
		if (!$fp = spip_fopen_lock($fichier, 'a', LOCK_EX))
			return;
	
		// liberer le verrou
		spip_flock($fp, LOCK_UN);
		@fclose($fp);
		spip_fclose_unlock($fp);
	}
	
	// supprimer
+0 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -102,7 +102,6 @@ function spip_nfslock($fichier,$max_age=0) {

	$id = creer_uniqid();
	$tpath = _DIR_TMP."slock.$id";
	
	$tmpfd = @fopen($tpath, 'w'); // hum, le 'x' necessite php4,3,2 ...
	if (!$tmpfd) {	/* open failed */
		@fclose($tmpfd);
+6 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -1229,10 +1229,14 @@ function spip_initialisation($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {

	// Sommes-nous dans l'empire du Mal ?
	// (ou sous le signe du Pingouin, ascendant GNU ?)
	if (strpos($_SERVER['SERVER_SOFTWARE'], '(Win') !== false)
	if (strpos($_SERVER['SERVER_SOFTWARE'], '(Win') !== false){
		define ('os_serveur', 'windows');
	else
		define('_SPIP_LOCK_MODE',1); // utiliser le flock php
	}
	else {
		define ('os_serveur', '');
		define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip
	}

	// Compatibilite avec serveurs ne fournissant pas $REQUEST_URI
	if (isset($_SERVER['REQUEST_URI'])) {
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -310,7 +310,7 @@ $spip_version = 1.943;
// (ce qui marche pour yy ne marchera pas forcement sur une version plus ancienne)
// type nouvelles fonctionnalites, deplacement de fonctions ...
$spip_version_affichee = '1.9.3 dev';
$spip_version_code = '1.9259';
$spip_version_code = '1.9260';

// ** Securite **
$auteur_session = $connect_statut = $connect_toutes_rubriques =  $hash_recherche = $hash_recherche_strict = $ldap_present ='';