IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WordPress PHP Discussion :

Headers/Sessions : session_start() - Cannot start session when headers already sent


Sujet :

WordPress PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2020
    Messages : 4
    Points : 3
    Points
    3
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Les cas les plus courants :
    -- un BOM qui traîne (pas forcément le EFBBBF, il y en a d'autres), et pas forcément dans un fichier .php (on peut faire par ex. "include 'common.inc'")
    -- un caractère en fin de script après le ?> => Mieux vaut ne pas utiliser la balise fermante PHP pour éviter ces soucis
    -- attention, l'output buffering peut venir brouiller les pistes => Un fichier inclus après le démarrage de la session peut aussi être en cause

    Pour remonter la pile des fichiers inclus :
    -- get_included_files()
    -- debug_backtrace()

    Bon courage
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/03/2019, 14h55
  2. Réponses: 9
    Dernier message: 14/01/2016, 23h20
  3. session_start() : Cannot send session cache limiter - headers already sent
    Par Keweed dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/09/2009, 10h14
  4. Réponses: 10
    Dernier message: 19/06/2008, 14h27
  5. session start et headers already sent
    Par corsamobile dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2008, 13h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo