Browse Source

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)
svn/attic/branches/spip-2.0.0/12601
Cerdic 14 years ago
parent
commit
35be5f6430
  1. 63
      ecrire/inc/flock.php
  2. 1
      ecrire/inc/nfslock.php
  3. 8
      ecrire/inc/utils.php
  4. 2
      ecrire/inc_version.php

63
ecrire/inc/flock.php

@ -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

1
ecrire/inc/nfslock.php

@ -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);

8
ecrire/inc/utils.php

@ -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'])) {

2
ecrire/inc_version.php

@ -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 ='';

Loading…
Cancel
Save