Le planet-libre en rade : plus de peur que de mal
Vous avez peut-être constaté que avant-hier soir et hier le Planet-Libre a subi quelques indisponibilités. En effet, le serveur était complètement down.
Nous avons d’abord cru à une attaque par déni de service type SYN_FLOOD mais impossible de mettre la main sur un attaquant. Soit cet attaquant était très bon, soit nous étions vraiment nul en administration système. Nous avons donc cherché plusieurs pistes et j’avoue que ça nous a bien pris la tête. Quoiqu’on fasse, le serveur retombait dans son cycle infini dès qu’on redémarrait le serveur Apache.
Finalement nous avons travaillés par élimination en cherchant progressivement page par page où ça pouvait planter.
Le pire c’est lorsqu’on a réellement découvert le problème. Nous nous étions fait avoir par une boucle infinie. En effet, le Bilboplanet n’avait jamais été testé avec des articles sans texte. Or récemment quelqu’un a publié un article sans contenu (seulement une image). Cette situation nous menait dans une boucle infinie qui forcément impliquait une charge élevée du serveur.
Voici le code qui posait problème. Ce code a pour but de calculer le caractère « espace » le plus proche afin de permettre (plus loin dans le code) de ne pas tronquer le texte au milieu d’un mot. Ce code plantait si la variable $string était vide !
# Function to split string only on space char function split_space ($string, $len) { $search_space = substr($string, $len, 1); while ($search_space != " ") { $len = $len - 1; $search_space = substr($string, $len, 1); } return $len; }
Il suffisait donc de permettre à la boucle de sortir, même si le contenu ne contient pas de caractère « espace » :
# Function to split string only on space char function split_space ($string, $len) { $search_space = substr($string, $len, 1); while ($search_space != " " && $len != 0) { $len = $len - 1; $search_space = substr($string, $len, 1); } return $len; }
Le problème a désormais été réglé et on ne devrait plus rencontrer de problèmes. Nous avons également remplacé cette fonction par une fonction provenant des librairies php (strrpos) qui fait exactement la même chose, mais en mieux !
Désolé pour le désagrément provoqué suite à ce downtime.