graphique_requetes_header.png

Une faille sous WordPress ?

Je ne sais pas si vous avez remarqué mais le site a récemment été indisponible par intermittence.

Vous êtes surement tombés sur la page suivante :

install.php

Wordpress_welcome.png

Cette page permet à n'importe qui de réinitialiser le blog avec sa propre adresse mail. WordPress précise d'ailleurs à l'installation de supprimer le fichier "wp-admin/install.php", mais une MAJ de WordPress avait du me le remettre.

Sécuriser l'accès au fichier d'install

Je me suis donc empressé d'interdire l'accès à la page "install.php" en ajoutant dans un fichier ".htaccess" :

<Files install.php>
Order Allow,Deny
Deny from all
Satisfy all
</Files>

On va dire que je l'ai échappé belle ! C'est en tout cas le genre de choses qui mettent un peu de piment dans la gestion d'un site Web...

Quota de requêtes explosé

Cette page apparaît lorsque la base SQL ne répond pas. En voulant me connecter sur celle-ci, je tombe sur l'erreur suivante :

Erreur

requête SQL: Modifier

SET CHARACTER SET 'utf8';

MySQL a répondu:Documentation
#1226 - User 'xxx' has exceeded the 'max_questions' resource (current value: 80000)

Cela signifie que j'ai dépassé le quota de 80 000 requêtes par heure sur le serveur SQL de mon hébergeur.

Déterminer le nombre de requêtes générées par page

Avec l'aide mon hébergeur, j'ai pu un peu plus rapidement identifié la source du problème (merci à lui !).

En plaçant la requête suivante dans mon footer.php, je peux connaître le nombre de requêtes que génère une page donnée :

<:-- <?php echo get_num_queries(); ?> requetes. <?php timer_stop(1); ?> secondes. -->

Je me suis ensuite aperçu que mon article sur les P2P anonymes, sécurisés et cryptés générait plus de 950 requêtes par affichage à cause des 230 commentaires affichés sur une même page. Il suffit donc de 80 visites sur cet article en l'espace d'une heure pour dépasser le quota (la solution que j'expose ensuite permet de ramener ce nombre à 1000).

Je me suis donc dit qu'il fallait que je pagine mes commentaires, brillante déduction remarquerez-vous. WordPress propose cette option à partir de la version 2.7.0., et ce,  dans l'espace Admin :

Réglages / Discussions /Diviser les commentaires en pages, avec x commentaires par page et la x page affichée par défaut

Activer la pagination des commentaires pour un ancien thème

Cependant, si vous utilisez un thème, comme moi, plus ancien que cette version de WordPress, le code par défaut n'y est pas implémenté. Il faut alors le rajouter à la main le code suivant, en éditant le fichier "comments.php" situé dans le dossier de votre thème :

<ol id="commentlist">
<?php wp_list_comments(); ?></ol>
<div id="navigation">
<?php paginate_comments_links($page_links) ?>
</div>
<?php else : // this is displayed if there are no comments so far ?>
<?php if ( comments_open() ) :
// If comments are open, but there are no comments.
else : // comments are closed
endif;
endif;
?>

Il faut placer le code après :

<?php if ($comments) : ?>

(...)

Conclusion

Mon article génère maintenant beaucoup moins de requêtes et reste en dessous du quota fixé par le serveur.

J'ai appliqué le plugin SuperCache également pour réduire le nombre de requêtes (recours au cache pour soulager le serveur SQL).

J'espère que cet article rendra service à tous ceux qui ont ou qui rencontreront le problème ou à ceux qui gèrent un site Web sous WordPress et qui veulent se prévenir de ce souci technique.

Pour les autres qui auront eu le courage de le lire sans savoir lire un seul morceau de code, on va dire qu'il évoque un peu l'envers du décor de l'administration d'un site Web !

EDIT : J'ai pu diviser le nombre de requêtes encore par 2 en désactivant le plugin No-Follow Free qui permet d'augmenter le PageRank des personnes laissant des commentaires.

Poursuivre votre lecture sur le site