Depuis des mois j’avais des problèmes de blocage et forts temps d’attente sur un site SPIP 1.9.2 hébergé en mutualisé chez un prestataire du marché. Ces blocages surviennent autant en partie publiques qu’en partie privé. Le fonctionnement devient chaotique et pénalise fortement l’utilisation du site.
Après quelques échanges avec le support toujours pas de solution. Il fallait voir s’il n’y avait pas trop d’images lourdes en page d’accueil, changer de contrat pour un plus professionnel, Mais en résumé cela venait de SPIP et j’avais du mal à le croire.
La suite prouvera qu’ils avaient en partie raison!
Entre-temps je procède divers essais :
-Installation d’un SPIP 2.0 sur une base neuve, je retrouve les mêmes problèmes
-Petits script php pour tester la base de données , … pas de temps d’attente
-Retrait des pluggins ,retrait du squelette toujours les blocages.
Puis je me lance dans l’installation de joomla et commence à y écrire quelques articles en étant sûr d’avoir là aussi des blocages. Et bien non tout fonctionne normalement.
J’en viens à penser que le support à raison. que les soucis viennent du code de SPIP, j’envisage à regret une migration.
Quand enfin toujours à la recherche du problème je tombe sur un post dans un forum conseillant de supprimer les appels à la fonction flock dans spip car ce flock ne fonctionne pas avec le système NFS. Je ne sais pas si l’hébergeur utilise NFS . mais la description et l’explication des problèmes concorde avec ceux que je rencontre.
Ainsi ni une ni deux je charge le fichier ecrire/inc/flock.php et commente les ligne ou la fonction lock et unlock est utilisée par un petit ;// flock
Je sauve, vide le cache SPIP et surfe sur le site. EUREKA, il n’y a plus de blocage. je parcours dans tous les sens, consulte la partie privé IL N’Y A PLUS DE BLOCAGE ….
J’édite le même fichier dans le spip 2.0.0 d’essai et je vois que le problème a été abordé puisque maintenant on peut jouer sur des constantes pour mettre hors jeu les appels aux lock ou pour utiliser un spip_nfs_lock en remplacement du lock php.
Ils avaient raison …
Entre-temps j’ai eu confirmation par l’hébergeur de l’utilisation de NFS.
Etapes à suivre pour résoudre le bug:
Pour spip 1.9.2:
1)Avec un programme « client ftp » (j’utilise filezilla) se connecter sur la partie FTP du site.
2)Naviguer dans les repertoires Spip jusqu’au fichier : /ecrire/inc/flock.php
3)En faire une copie de sauvegarde.
4)Editer le fichier : Pour cela le ramener sur son PC dans un repertoire temporaire de travail. (Filezilla permet d’éditer directement)
5) Mettre en commentaire par l’ajout d’un ;// les lignes faisant appel à la fonction flock. Il y a 6 lignes
Ci-dessous un extrait de code :
function lire_fichier ($fichier, &$contenu, $options=false) {
$contenu = »;
if (!@file_exists($fichier))
return false;
#spip_timer(‘lire_fichier’);
if ($fl = @fopen($fichier, ‘r’)) {
// verrou lecture
// ***** Mise en commentaire pour PB NFS *****
;//@flock($fl, LOCK_SH);
// a-t-il ete supprime par le locker ?
if (!@file_exists($fichier)) {
@fclose($fl);
return false;
}
// lire le fichier
$contenu = spip_file_get_contents($fichier);
// liberer le verrou
// ***** Mise en commentaire pour PB NFS *****
;//@flock($fl, LOCK_UN);
@fclose($fl);
// Verifications
$ok = true;
if ($options['phpcheck'] == ‘oui’)
$ok &= (ereg(« [?]>\n?$ », $contenu));
#spip_log(« $fread $fichier « .spip_timer(‘lire_fichier’));
if (!$ok)
spip_log(« echec lecture $fichier »);
return $ok;
}
}
6) enregistrer le fichier
7) Avec le client ftp le replacer dans l’arborescence (/ecrire/inc/flock.php ) FTP chez l’hébergeur.
vider le cache et essayer.
Attention : je ne connais pas exactement le rôle du flock dans l’application spip. la mise en commentaire de ces lignes peut amener un dysfonctionnement. Il est probable que cela peut arriver si plusieurs rédacteurs valident un article , une rubrique au même instant. Sur le site auquel j’ai apporté cette modification je n’ai pas constaté de problème mais il y a trés peu d’activité de rédaction et l’affluence sur ce site est faible.
Le mieux est de passer en spip 2.0 car ce problème de flock y a été pris en compte. Il faut toutefois faire une petite modification dans le fichier /ecrire/inc/flock.php.
La modification :
On voit ci-dessous qu’il suffit de valider le SPIP_LOCK_MODE à 2 pour utiliser le nfslock.
/***************************************************************************\
* SPIP, Systeme de publication pour l’internet *
* *
* Copyright (c) 2001-2009 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l’aide en ligne. *
\***************************************************************************/
if (!defined(« _ECRIRE_INC_VERSION »)) return;
#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
Encore un avertissement : Je n’ai fait que quelques essais concluants sur un site spip 2.0 presque vide, mais je n’ai pas plus de recul pour savoir si la solution est viable.
Pour la modification du fichier reprendre la méthode précédemment expliquée.
Aie : une mauvaise manipulation avec scribefire pour mettre à jour cet article a supprimé tous les commentaires …