[Je croyais l'avoir déjà envoyé mais je ne vois rien dans la liste. Je
réenvoie, amélioré.]
Je suis en train d'étudier la possibilité de faire passer un gros site
existant (plein de pages HTML déjà faites) dans Spip *et* de gérer un
(très) gros site Spip.
Le contexte : un client (les clients ont toujours raison) a un site de
180 000 pages HTML statiques qu'il voudrait passer dans Spip pour
bénéficier des forums par rubrique, des mots-clés, etc.
Premier problème : l'injecter dans Spip. En m'aidant de
<URL:http://www.uzine.net/article713.html>, je fais un programme qui
extrait le titre et le contenu de chaque page et l'envoit dans la
base. Ca prend deux heures, mais ça marche, j'ai mis 110 000 articles
dans Spip.
Questions sur le premier problème : y a t-il des pièges ou bien des
risques particuliers ? Le schéma de la base de données de Spip ne
contient pas de contraintes d'intégrité (parce que MySQL ne sait pas
faire ?). Par exemple, on peut injecter un article avec un statut nul
alors que Spip ne sait pas les traiter. C'est par essai/erreur que
j'ai découvert les contraintes à respecter.
Deuxième problème : une fois tout injecté, ça rame. Horriblement. Bien
sûr, la machine de test est peu rapide mais je suis pour l'instant le
seul lecteur. Donc, faut optimiser.
<URL:http://www.uzine.net/article997.html> et la page ci-dessus ne
contiennent guère d'indication pour ce problème des gros
sites. Notamment, rien sur l'optimisation de la base de données, les
index recommandés, etc. Un profilage sommaire indique que c'est MySQL
qui nous bloque. Je lis
<URL:http://www.mysql.com/doc/M/y/MySQL_Optimisation.html>, je vais
faire quelques EXPLAIN mais, avant de me lancer, je voudrais savoir qi
quelqu'un l'a déjà fait et écrit le "SPIP Optimisation HOWTO" ?
Question supplémentaire sur le deuxième problème : j'injecte tout dans
une seule rubrique. Ai-je intérêt, pour ce qui concerne les
performances, à injecter dans N rubriques ? Ca ne changera pas la
table spip_articles mais cela peut changer la façon dont Spip accès
aux articles.
From antoine@rezo.net Wed Mar 6 12:58:16 2002
Return-Path: <antoine@rezo.net>
Received: from rezo.net (localhost [127.0.0.1])
by miel.brainstorm.fr (Postfix) with SMTP id 115FE1D377
for <spip@rezo.net>; Wed, 6 Mar 2002 12:58:16 +0100 (CET)
Received: from 193.49.124.64
(SquirrelMail authenticated user antoine)
by rezo.net with HTTP;
Wed, 6 Mar 2002 12:58:16 +0100 (CET)
Message-ID: <60265.193.49.124.64.1015415896.squirrel@rezo.net>
Date: Wed, 6 Mar 2002 12:58:16 +0100 (CET)
Subject: Re: [Spip] Injecter un site existant dans Spip et optimiser Spip
pour un
From: "Antoine" <antoine@rezo.net>
To: <spip@rezo.net>
In-Reply-To: <20020306113649.GA5424@staff.netaktiv.com>
References: <20020306113649.GA5424@staff.netaktiv.com>
X-Priority: 3
Importance: Normal
X-MSMail-Priority: Normal
X-Mailer: SquirrelMail (version 1.2.2)
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
Sender: spip-bounces@rezo.net
Errors-To: spip-bounces@rezo.net
X-BeenThere: spip@rezo.net
X-Mailman-Version: 2.1a4+
Precedence: bulk
List-Help: <mailto:spip-request@rezo.net?subject=help>
List-Post: <mailto:spip@rezo.net>
List-Subscribe: <http://listes.rezo.net/mailman/listinfo/spip>,
<mailto:spip-request@rezo.net?subject=subscribe>
List-Id: SPIP : questions/reponses <spip.rezo.net>
List-Unsubscribe: <http://listes.rezo.net/mailman/listinfo/spip>,
<mailto:spip-request@rezo.net?subject=unsubscribe>
List-Archive: Discuter chez rezo.net
X-List-Received-Date: Wed, 06 Mar 2002 11:58:16 -0000
Status: O
Content-Length: 2232
Lines: 56
Salut,
Premier problème : l'injecter dans Spip. En m'aidant de
<URL:http://www.uzine.net/article713.html>, je fais un programme qui
extrait le titre et le contenu de chaque page et l'envoit dans la
base. Ca prend deux heures, mais ça marche, j'ai mis 110 000 articles
dans Spip.
Effectivement, c'est assez gros. Tu dois être le premier à faire un
SPIP de cette taille (même le Diplo fait pâle figure à côté, avec ses
quelques milliers d'articles). Chapeau ![]()
C'est par essai/erreur que j'ai
découvert les contraintes à respecter.
Il n'y en a pas beaucoup, surtout pour les articles. Tu devrais faire
un tour dans ecrire/optimiser.php3, qui s'occupe périodiquement de
forcer certaines règles de cohérence et de propreté dans la base.
(au fait, oui, MySQL ne connaît pas les contraintes, par contre c'est
vrai que pour les statuts on aurait pu mettre un ENUM...)
Deuxième problème : une fois tout injecté, ça rame. Horriblement. Bien
sûr, la machine de test est peu rapide mais je suis pour l'instant le
seul lecteur. Donc, faut optimiser.
Quelles sont les pages qui rament ? Dans l'espace public et/ou dans
l'espace privé ?
Question supplémentaire sur le deuxième problème : j'injecte tout dans
une seule rubrique. Ai-je intérêt, pour ce qui concerne les
performances, à injecter dans N rubriques ? Ca ne changera pas la
table spip_articles mais cela peut changer la façon dont Spip accès aux
articles.
Ah oui, c'est clair que ce sera plus rapide, surtout dans l'espace privé
("naviguer dans le site" et "afficher tout le site"). Pour que ça se
répercute dans l'espace public, il faut bien sûr que celui-ci utilise
la discrimination par rubriques dans l'affichage.
Dans ton cas, il peut aussi être utile d'ajouter un index sur le statut
et sur la date des articles (notamment si tu veux afficher la liste des
derniers articles publiés). En tout état de cause, il serait bon d'activer
le "slow_query_log" dans MySQL et de faire un EXPLAIN des requêtes trop
longues.
Une fois assuré que toutes les requêtes font appel à un index, tu devras
peut-être optimiser MySQL lui-même (en augmentant le key_buffer_size si
nécessaire). Tu nous tiens au courant de tes avancées ?
Amicalement
Antoine.