Start_session problem

Hallo

Ich habe mit PHP angefangen und bin gerade in meiner zweiten Lern „Session“ :wink:

In der Übung geht es um die function start_session(); Im Buch steht das die globale variable $_Session = null ist bis man start_session() aufruft.

Als Test ist folgender Code angegeben

var_dump($_SESSION);
session_start();
var_dump($_SESSION);

Der erstmal auch verständlich ist.
Nur wenn ich das auf meinem Webspace online ausführe, bekomme ich folgende Meldung.

NULL
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at …/index.php:16) in …/index.php on line 19

Wieso kommt das? Was mache ich Falsch?

lg

das sieht doch nach einem häufigen Fehler aus und du hast eine schöne markante Fehlermeldung zur Suche
->
ein Ergebnis, mit Tipps und weiteren Links
[Erledigt] Cannot send session cache limiter - headers already sent - php.de

die letzten beiden Postings gerade erst aus 2015 und auch zu localhost/ Webserver,
Link dort
Headers already sent

grunsätzliche Themen: keine frühe Ausgabe, hast du wahrscheinlich nicht wenn es lokal geht,
dann noch Frage nach Kodierung der Datei, UTF-8, Byte-Order-Mark, welcher Editor benutzt?

Mit dem var dump hast su schon einen output und kannst somit keine session mehr starten

Grundsätzlich sollte session_start(), wenn verwendet, immer direkt als erstes kommen, also das deine Files grundsätzlich mit

<?php session_start();

beginnen.
Bezüglich des von Rose angemerkten Outputs : es gibt eine Art Cache-Funktion die man nutzen kann womit der Output an den Browser bis zum “flush()” zurückgehalten wird, kann dir aber aus dem Kopf nicht sagen welche das genau ist.
Letzlich ist der Fehler das durch dumpvar() halt bereits ein Output erzeugt wird was wiederum zur Folge hat das bereits der komplette HTTP-Header zusammengebaut und verschickt wird. Da aber das Session-Cookie in diesen Header mit rein muss ist es schon zu spät, was dir PHP mit dieser Meldung recht gut erklärt.

Es gibt auch eine Möglichkeit des automatischen Session-Handlings. Dabei wird PHP so eingestellt das grundsätzlich jeder Aufruf einen impliziten call auf session_start() bekommt. Kann man auch auf Link-Ebene ohne Cookie umsetzen, ist aber insgesamt eher experimentell als wirklich produktiv sinnvoll. Es gibt teilweise Probleme eine Session zu beenden / löschen, so dass dann quasi ein logout eines Users nicht richtig funktioniert. Kritisch wird sowas mit zu langen Session-Timeout.

Also bevor ich an jeder PHP-Datei ein session_start() aufrufe, kann ich gleich den session auto start einsetzen. Kommt aufs selbe.

Generell sollte es eher so sein, dass ein session_start() nur dann aufgerufen werden soll, wenn man Zugriff auf die $_SESSION braucht. Und dann so bald wie möglich mit session_write_close() denn Schreibzugriff schließen. Also wenn man nur liest, direkt nach dem start ein write close, ansonsten nach dem letzten Schreibzugriff sofort schließen und dann erst was anderes machen. Sollte man nach einen session_write_close() nochmal schreiben wollen, einfach wieder ein session_start() ausführen.

Der Grund: Bei einen session_start() wird ein write lock auf die Session-Datei gelegt und parallele Zugriffe auf die gleich Session-Datei sind dann nicht mehr möglich. Nette Race-Condition, wenn eine Seite lange lädt, geht gar nichts mehr, bzw. bremst es total aus, wenn man viel mit Ajax arbeitet.

Um so mit den Sessions zu arbeiten, muss man natürlich den ganzen Output zwischen ob_start() und ob_end_flush() einschließen.