session.save_path lässt sich nicht ändern

Tach. Wollte mal gefragt haben, warum sich denn die session.save_path Einstellung hier nicht ändern lässt.

Laut der PHP-Dokumentation soll man das ja benutzen, wenn man Skripts mit verschiedenen Session-Laufzeiten betreibt, weil die sich sonst gegenseiting Sessions weglöschen können.

Note: If different scripts have different values of session.gc_maxlifetime but share the same place for storing the session data then the script with the minimum value will be cleaning the data. In this case, use this directive together with session.save_path.

Jedenfalls nehme ich mal an, dass das was bplaced-spezifisches ist… gibt ja die session_save_path() Funktion, aber die hat bei meinem Skript keinen Effekt.

hi Scram

also ja, das ist richtig, der Pfad lässt sich nicht ändern, da vielerlei Software einfach irgendwelche Pfade annimmt, die wir dafür nicht vorgesehen haben. Das allergrößte NVMe-gestützte Tempo gibt es in genau dem vorgegebenen Pfad - dass sich da aber was gegenseitig weglöschen könnte wäre mir an sich auch neu.

Wir “bereinigen” die Session-Ordner an sich selbst, ich vermute fast, dass mit diesem Abschnitt in der Dokumentation etwas anderes gemeint sein könnte.

Hier mal ein Extrembeispiel von dem, was ich meine.

Das erste Skript gibt eine GC-Zeit von 1 Tag an, das zweite 1 Sekunde.

<?php
header('Content-Type: text/plain; charset=UTF-8');
header('Cache-Control: private, no-cache');

session_start([
	'name' => 'session1',
	'gc_maxlifetime' => 86400
]);

$_SESSION['counter'] = ($_SESSION['counter'] ?? 0) + 1;
echo $_SESSION['counter'];
?>
<?php
header('Content-Type: text/plain; charset=UTF-8');
header('Cache-Control: private, no-cache');

session_start([
	'name' => 'session2',
	'gc_maxlifetime' => 1,
	'gc_probability' => 1,
	'gc_divisor' => 1
]);
?>

Wenn man eine Sekunde verstreichen lässt und dann das zweite Skript aufruft, löscht das dem anderen Skript die Session vorzeitig weg, weil die Session-Dateien im gleichen Verzeichnis liegen. PHP betrachtet da anscheinend nur die mtime.

Ja interessant, die Sessions haben ja alle eigene IDs, dieses Verhalten war mir bislang so nicht bewusst.

Allerdings kann ich diese Einstellung nicht pro-Konto zulassen, sondern müsste sie allen als änderbar gestatten, was sicherlich in zu vielen Fällen zu ungünstigen temp-Verzeichnissen führen würde. Die Frage ist jetzt ob die Thematik so wichtig ist, oder ob das einfach so hinnehmbar ist, das Timeout für alle annähernd gleich einzustellen, oder beispielsweise allen eine längere einzustellen und aber dann in der kürzeren einfach ein $_SESSION[‘timeout’] einzubauen, das einen timestamp enthält der verglichen wird - ist er älter als das kürzer gewünschte intervall, dann einfach die Session auflösen bzw. das jeweilige Session-Cookie überschreiben.

1 Like

Ist sicher hinnehmbar, wenn sich 10 Jahre lang niemand beschwert hat. :smile:

Mich hat interessiert, warum die Einstellung hier festgenagelt ist, also danke für die Aufklärung. Ein eigenes Session-Timeout ist ja eh eigentlich das, was man als geplagte PHP-Drone machen soll, weil PHP das selber nicht so kann. https://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes