11
votes

Pourquoi ob_start () doit venir en avance sur Session_Start () pour travailler dans PHP?

Je ne pense pas que ce soit raisonnable.

Pourquoi est-ce en fait une telle règle?


1 commentaires

Franchement parler: Je n'ai pas entendu parler de cette règle!


5 Réponses :


15
votes

dans l'affaire " normale ", je ne pense pas ob_start doit être appelé avant session_start - ni l'autre solution .

citant le page manuelle de session_start , bien que:

session_start () enregistrera interne gestionnaire de sortie pour la réécriture de l'URL lorsque TRANS-SID est activé. Si un utilisateur utilise ob_gzhandler ou comme avec ob_start (), L'ordre du gestionnaire de sortie est important pour la sortie appropriée. Pour Exemple, l'utilisateur doit s'inscrire ob_gzhandler avant le début de la session.

Mais c'est une sorte de cas spécial: la chose est, ici, que l'ordre des gestionnaires de sortie est important: si vous voulez qu'un gestionnaire de modifier les choses que l'autre ait fait, ils doivent être exécutés dans le "droit" ordre.


Généralement, si vous n'utilisez pas ce type de manutention (apache et mod_deflate fait un excellent travail en matière de compression de la sortie, par exemple) , la seule chose qui compte est que les en-têtes ne doivent pas être envoyés avant d'appeler session_start (car, selon votre configuration, session_start envoie des cookies, passés en en-têtes HTTP) . .

et les en-têtes sont envoyés dès que toute autre donnée doit être envoyée - c'est-à-dire dès qu'il y a une sortie, même une personne à l'extérieur de Tags: < / p>

Remarque: Si vous utilisez une cookie basée sur la cookie Sessions, vous devez appeler session_start () avant tout ce qui est sortie sur le navigateur.

ob_start indique que PHP doit tamponner les données:

Cette fonction va tourner la sortie tampon sur. Alors que la mise en mémoire tampon de sortie est actif aucune sortie n'est envoyée de la script (autre que les en-têtes), à la place La sortie est stockée dans un interne tampon.

De cette façon, la sortie n'est pas envoyée avant de dire vous-même, " envoie les données ". Cela signifie que les en-têtes ne sont pas envoyés immédiatement - ce qui signifie session_start peut être appelé ultérieurement, même s'il aurait dû être sorti, si ob_start n'avait pas été utilisé.


J'espère que cela rend les choses un peu plus claires ...


0 commentaires

6
votes

Si par défaut, votre sortie_buffering est OFF et vous avez été assez malheureux pour envoyer un seul octet de données au client, puis votre http Les en-têtes ont déjà été envoyés. Qui empêche efficacement session_start () de passer l'en-tête de cookie au client. En appelant ob_start () Vous activez la mise en mémoire tampon et donc retarder l'envoi d'en-têtes HTTP.


0 commentaires

0
votes

session_start peut vouloir modifier l'en-tête HTTP si certaines options de configuration sont définies. Un exemple est session.use_cookies qui nécessite de définir / modifier le champ d'en-tête Cookie .

Modification de l'en-tête HTTP nécessite qu'il n'y ait aucune sortie déjà envoyée au client comme le HTTP Header est envoyé juste avant l'envoi de la première sortie.

Vous assurez soit qu'il n'y a absolument pas de sortie avant l'appel de session_start . Ou vous utilisez le Contrôle de la mémoire tampon de sortie pour tamponner la sortie de sorte que le L'en-tête HTTP peut être modifié même s'il est déjà sorti.


0 commentaires

0
votes

session_start () enregistrera le gestionnaire de sortie interne pour la réécriture d'URL lorsque trans-sid est activé. Si un utilisateur utilise ob_gzhandler ou similaire avec ob_start () , l'ordre du gestionnaire de sortie est important pour une sortie appropriée.

Par exemple, l'utilisateur doit enregistrer ob_gzhandler avant le début de la session.

Mais c'est une sorte de cas particulier. La chose est, ici, que l'ordre des gestionnaires de sortie est important. Si vous voulez un gestionnaire pour modifier les choses de l'autre ont fait, ils doivent être exécutés dans l'ordre « droit ».

En général, si vous ne pas utiliser ce genre de gestionnaires (Apache et mod_deflate faire un excellent travail en matière de compression de sortie, par exemple), la seule chose qui importe est que les en-têtes doivent Ne pas être envoyé avant d'appeler session_start (car, en fonction de votre configuration, session_start envoie des cookies, passés en en-têtes HTTP).

et les en-têtes sont envoyés dès que toute autre donnée doit être envoyée - c'est-à-dire dès qu'il y a une sortie, même une personne à l'extérieur de Tags: < / p>

Remarque:. Si vous utilisez des sessions basées sur les cookies, vous devez appeler session_start () avant tout est émis au navigateur

ob_start indique que PHP doit tamponner les données:

Cette fonction allumera la mise en mémoire tampon de sortie. Lorsque la mémoire tampon de sortie est active, aucune sortie n'est envoyée du script (autre que les en-têtes), la sortie est stockée dans un tampon interne.

De cette façon, la sortie n'est pas envoyée avant de dire vous-même, "envoyer les données". Cela signifie que les en-têtes ne sont pas envoyés immédiatement - ce que signifie session_start peut être appelé plus tard, même s'il aurait dû être sorti, si ob_start n'avait pas été utilisé.


0 commentaires

0
votes

session_start (); devrait être appelé avant que tous les en-têtes soient envoyés. ob_start () supprimera la sortie pendant un moment et vous pouvez casser cette règle. Généralement ob_start () sur le dessus est une solution rapide au cas où vous déboguerez quelque chose d'inconnu; Tout ce qui est ci-dessous fonctionne comme prévu (non seulement comme écrit ;-)). Je préfère utiliser ob_start () plus tard à session_start ().


0 commentaires