La fonction ‘search-replace’ de WP-CLI retourne un « Segmentation Fault »

L’utilisation de WP-CLI est omniprésente chez SatelliteWP! Si vous n’avez jamais entendu parler de l’outil, sachez que WP-CLI permet de contrôler votre site web utilisant WordPress directement à la ligne de commande.

Si, pour certains, c’est totalement inutile ou inconcevable de ne pas utiliser l’interface visuelle (User interface ou UI), c’est très pratique lorsqu’on souhaite exécuter successivement plusieurs tâches, et ce sans avoir à cliquer!

Exemple d’utilisation de WP-CLI

Lorsqu’on crée un environnement de développement pour le site web «www.satellitewp.com», par exemple, il est nécessaire de modifier les liens contenus dans la base de données. L’utilisateur moyen utilisera probablement une extension (plugin) pour y arriver. Il faut tout d’abord chercher l’extension dans le répertoire de WordPress, l’installer, l’activer, paramétrer la modification des adresses et lancer l’exécution. Ouf!

Votre site est une cible…

Nous sommes tous dans la mire des pirates. Obtenez une analyse gratuite de votre situation en moins de 5 minutes.

Avec WP-CLI, on lance tout simplement la commande search-replace contenant les bons paramètres et le tour est joué. Les paramètres sont toujours les mêmes alors c’est simple à se rappeler.

On peut pratiquement tout faire avec WP-CLI :

  • Ajouter un utilisateur
  • Modifier un réglage
  • Faire un backup de la base de données
  • Supprimer une page
  • Mettre à jour WordPress
  • Désactiver une extension
  • Installer un thème
  • Etc.

La liste des possibilités est (presque) sans fin!

« Segmentation Fault »

Récemment, nous avons souhaité modifier l’adresse de notre site dans la base de données de la façon suivante :

wp search-replace 'www.satellitewp.com' 'www.satellitewp.local'

Cette commande a comme mission de changer tous les «www.satellitewp.com» par des «www.satellitewp.local» suite à une copie du site sur un environnement local.

Cette commande est utilisée plusieurs par jour ici et n’avait jamais causé de problème. Mais pas cette fois…

Segmentation fault (core dumped)

Le message « Segmentation fault » signifie une erreur de segmentation qui provoque un crash de l’application… sans plus de détail.

Régler une erreur de segmentation dans WP-CLI

Lorsqu’un tel message s’affiche, les détails sont trop peu nombreux pour régler le problème. Nous avons besoin de plus d’information! Heureusement, le drapeau (flag) --debug permet l’affichage d’informations lors de l’exécution. Ainsi, la commande devient :

wp search-replace 'www.satellitewp.com' 'www.satellitewp.local' --debug

Une fois exécutée, il est maintenant possible de visualiser la raison ayant causé cette erreur fatale :

PHP Fatal error:  Uncaught TypeError: mysqli::real_connect(): Argument #5 ($port) must be of type ?int, string given in /home/websites/satellitewp/public/wp-includes/class-wpdb.php:2431

Error: Une erreur critique est survenue sur votre site.En apprendre plus sur le débogage de WordPress.

Dans le cas présent, avec un peu de recherche, il semble que le port lié à la connexion MySQL ne soit pas spécifié. Pour régler le tout, il suffit de modifier le fichier wp-config.php de manière à modifier le code suivant :

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

… pour ceci (qui inclut maintenant le port) :

/** MySQL hostname */
define( 'DB_HOST', 'localhost:3306' );

Une fois la modification complétée, il est possible de réessayer la commande initiale et constater si l’exécution se fait jusqu’à la fin :

Success: Made 18920 replacements.

Voilà! Ça fonctionne!

Est-ce que cette modification aurait dû être nécessaire? La réponse est non! Par contre, cette voie de contournement peut être pratique quand on ne contrôle pas l’environnement où WP-CLI a été installé et qu’on souhaite remplacer des données dans la base de données!

WP-CLI est un outil ultra pratique qui permet d’accélérer drastiquement une foule de tâches liées au développement, à l’entretien et au débogage de sites web WordPress.

Bon développement!

Articles apparentés