Headers/Sessions : session_start() - Cannot start session when headers already sent
Bonjour,
Voici ma stack WordPress 5.5 / PHP 7.4 / Divi Theme 4.5.7 / Apache 2.4 HTTP2 SSL. J'utilise également entre autre WPRocket (plugin de compression).
J'essaie actuellement de corriger un avertissement récurrent (warning) issu de mon propre fichier functions.php qui revient sans cesse dans mon debug.log :
"PHP warning: session_start(): Cannot start session when headers already sent in /wp-content/themes/Divi-child/functions.php on line 5"
Mon code pour démarrer la session dans mon fichier functions.php est le suivant :
Code:
1 2 3 4 5 6
| <?php
add_action('init', 'start_session', 1);
function start_session() {
if(!session_id()) session_start();
} |
De ce que j'ai pu comprendre :
- Il faut que la fonction session_start soit au tout début du fichier PHP, juste après la balise PHP, c'est le cas du Hook init dans mon code.
- Cette erreur peut être du à une autre fonction similaire, dans un autre fichier. J'ai vérifié un maximum de fichiers et des plugins et ils ne semblent pas utiliser de fonction similaire, ni même de fonction envoyant des headers. Je suis preneur d'une astuce / bonne pratique pour vérifier cela méthodiquement.
- Bien que j'utilise Notepad++, cela peut être aussi du à l'enregistrement de fichiers avec éditeur (Bloc Note Windows) qui encoderait les fichiers en UTF-8 avec BOM. J'ai aussi vérifié que mes fichiers ne contenaient pas de BOM et étaient encodés en UTF-8 sans BOM grâce à cette commande sur l'ensemble de mes fichiers du site web :
grep -rl $'\xEF\xBB\xBF' . | grep ".php"
J'ai regardé les issues sur plusieurs forums, j'ai essayé plusieurs façon d'écrire la fonction ou de vérifier qu'aucune session n'était démarrée ailleurs, mais sans succès..
J'aimerai savoir si quelqu'un à déjà pu résoudre ce type de problème, ou si quelqu'un sait d'où peut provenir cette erreur ou comment le diagnostiquer ?
Aujourd'hui je suis contraint d'utiliser l'arrobase @session_start(), afin d'ignorer les logs d'erreur sur cet appel, ce qui ne me semble pas être une bonne pratique !
Je soupçonne :
- soit un problème d'ordonnancement / de hiérarchie d'appel, provoquant l'envoi des headers au client (thread / plugin...)
- soit un fichier BOM qui soit en dehors de la racine de mon site (configuration Apache / Header Apache)
- soit un mauvais closing d'une balise PHP (plugin ou code mauvais)
Merci d'avance pour vos réponses.