Pourtant, dès que vous ouvrez votre navigateur sur http://localhost ou http://localhost/phpmyadmin : rien ne va plus. La page tourne indéfiniment dans le vide, finit par afficher un code d'erreur HY000/2002 (connexion refusée) ou pire, Apache affiche une liste improbable de numéros de ports inconnus (299, 48569, 55165).
Que s'est-il passé ? Comment un serveur peut-il être affiché comme « actif » alors qu'aucun site ne s'ouvre ? Plongée dans les coulisses d'un des pièges les plus déroutants de XAMPP sous Windows.
Les symptômes d’une panne trompeuse
Ce bug se manifeste généralement par trois signaux caractéristiques :
L’illusion du vert : Dans le panneau XAMPP, les modules Apache et MySQL ont bien un identifiant de processus (PID) et une couleur verte rassurante.
Des ports bizarres pour Apache : Au lieu d'afficher simplement les ports habituels 80, 443, la colonne Port(s) d'Apache affiche des dizaines de ports aléatoires élevés (comme 48569, 55165).
Le crash silencieux des requêtes : Vos sites WordPress, Laravel, ou vos scripts PHP classiques moulinent jusqu'à afficher :
mysqli::real_connect(): (HY000/2002): Aucune connexion n’a pu être établie car l’ordinateur cible l’a expressément refusée.
L’explication technique : le piège du « PID fantôme »
Sous le capot, voici ce qui se produit en réalité :
1. Le faux statut de MySQL
Lors d'une extinction inattendue de Windows, d'une coupure de courant ou d'un arrêt forcé, MariaDB/MySQL peut être coupé brutalement sans avoir le temps d'effacer son fichier verrou : mysql.pid.
Au démarrage suivant, le panneau XAMPP vérifie la présence de ce fichier. Trouvant un numéro de PID enregistré, XAMPP en déduit à tort : « MySQL tourne déjà ! » et passe le voyant au vert.
Problème : le processus n'existe pas en mémoire, et le port 3306 n'est jamais ouvert.
2. L’asphyxie d’Apache
Lorsque vous tentez d'ouvrir un projet PHP ou phpMyAdmin, Apache exécute le script. Celui-ci tente de joindre la base de données sur le port 3306.
Comme personne ne répond, Windows tente obstinément d'établir la connexion (état TCP SynSent). Chaque tentative monopolise un port temporaire sortant. XAMPP interroge les processus d'Apache et affiche ces ports temporaires dans son tableau de bord, donnant cette étrange liste de ports à 5 chiffres.
À force d'attendre des connexions MySQL qui n'aboutissent jamais, les processus d'Apache finissent par saturer, et tous vos sites locaux deviennent inaccessibles.
La méthode pas-à-pas pour débloquer la situation
Si vous faites face à cette panne, pas de panique : aucune donnée n'est perdue. Voici la marche à suivre pour remettre d'aplomb votre environnement de développement :
Étape 1 : Nettoyer le fichier verrou résiduel
Fermez le XAMPP Control Panel.
Ouvrez l'explorateur de fichiers et rendez-vous dans le dossier :
C:\xampp\mysql\data\
Cherchez le fichier nommé mysql.pid et supprimez-le (il s'agit d'un simple fichier temporaire). (Profitez-en pour vérifier que vous ne touchez pas aux dossiers de vos bases de données ni au fichier ibdata1).
Étape 2 : Purger les processus zombies
Ouvrez le Gestionnaire des tâches Windows (Ctrl + Shift + Échap) :
Dans l'onglet Détails ou Processus, vérifiez s'il reste des instances de httpd.exe ou mysqld.exe.
Si oui, effectuez un clic droit > Fin de tâche.
Étape 3 : Relancer proprement les services
Relancez le XAMPP Control Panel en tant qu'administrateur.
Cliquez sur Start en face d'Apache : vous devez voir uniquement les ports 80, 443.
Cliquez sur Start en face de MySQL : il doit démarrer avec son propre PID et afficher le port 3306.
Testez immédiatement dans votre navigateur :
http://localhost/
http://localhost/phpmyadmin/
Tout doit désormais répondre instantanément !
Le bon réflexe pour l’avenir
Pour éviter que ce problème ne réapparaisse :
Prenez l'habitude de cliquer sur "Stop" dans XAMPP avant d'éteindre ou de redémarrer votre PC. MySQL aura ainsi le temps de clore ses transactions InnoDB et d'effacer proprement son fichier .pid.
Si vous devez migrer des bases de données manuellement, évitez de copier-coller à chaud les dossiers du répertoire data sans exporter/importer proprement vos fichiers .sql via phpMyAdmin ou la commande mysqldump.