Webhosting 2000: Session Cookie wird anscheinend serverseitig vor Ablauf gelöscht

  • Moin zusammen.


    ich habe in Problem mit einem Session-Cookie in Verbindung mit meinem Webhosting 2000.
    Die Session Standardwerte bei meinem Hosting sind:



    session.auto_start Off Off
    session.cache_expire 180 180
    session.cache_limiter nocache nocache
    session.cookie_domain no value no value
    session.cookie_httponly no value no value
    session.cookie_lifetime 0 0
    session.cookie_path / /
    session.cookie_samesite no value no value
    session.cookie_secure 0 0
    session.gc_divisor 1000 1000
    session.gc_maxlifetime 1440 1440
    session.gc_probability 0 0
    session.lazy_write On On
    session.name PHPSESSID PHPSESSID
    session.referer_check no value no value
    session.save_handler files files
    session.save_path /var/lib/php/sessions /var/lib/php/sessions
    session.serialize_handler php php
    session.sid_bits_per_character 4 4
    session.sid_length 32 32
    session.upload_progress.cleanup On On
    session.upload_progress.enabled On On
    session.upload_progress.freq 1% 1%
    session.upload_progress.min_freq 1 1
    session.upload_progress.name PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
    session.upload_progress.prefix upload_progress_ upload_progress_
    session.use_cookies 1 1
    session.use_only_cookies 1 1
    session.use_strict_mode 0 0
    session.use_trans_sid 0 0

    Nun habe ich per PHP eine Session gestartet und einer Session-Variablen einen Wert zugewiesen:


    Code
    1. ini_set('session.cookie_lifetime', '40000');ini_set('session.gc_maxlifetime', '40000');ini_set('session.gc_probability', '1');session_set_cookie_params(40000,"/");session_start([    'cookie_lifetime' => 40000,]);
    2.  $_SESSION['login_user'] = $myemail;


    Später wird der Wert (z.B.) bei einem Reload wieder ausgelesen:


    Code
    1.  if(!isset($_SESSION['login_user'])){
    2.       header("location:login.php");
    3.      die();
    4.    }


    Laut den Einstellungen ist der Sessioncookie ja 40000 Sekunden gültig, dies wird mir auch im Browser angezeigt. Leider fliege ich jedoch nach einer unbestimmten Zeit (noch nicht gemessen, ca. 0,5-1 Stunde) wieder raus.
    Hier habe ich die Vermutung, dass die Session serverseitig (z.B. Garbage collection wegen shared Hosting) gelöscht wird.
    Ist das Problem bekannt, bzw. habe ich hier evtl einen Fehler gemacht?

    Danke im voraus.

  • Ich weiß nicht, wie es bei Plesk standardmäßig unter der Haube gehandhabt wird, aber bei Debian (das im Webhosting zum Einsatz kommt) werden dateibasierte Sessions im Standardordner normalerweise durch einen Cronjob gelöscht. Dieser Cronjob greift auf die systemweite Standard-php.ini zurück und weiß nicht, wie hoch Du diesen Wert gesetzt hast.


    Was Du versuchen könntest: Lass den session.save_path auf einen Ordner innerhalb Deines Webspaces zeigen. Dieser sollte natürlich nicht über HTTP erreichbar bzw. geschützt sein!


    Bei einem anderen Speicherort musst Du Dich aber selbst um die Bereinigung alter Sessiondateien kümmern. Ich habe damit noch keine Erfahrung gesammelt, aber die Konfigurationsoptionen session.gc_* sehen ganz vielversprechend aus. Notfalls tut es sicher auch ein Shellscript mit find als Cronjob.


    Wenn etwas unklar ist, einfach nachfragen… :-)

  • Das geht leider nicht. Sobald ich einen anderen path angebe, bekomme ich einen Error, da dies anscheinend nicht erlaubt ist.

  • Sobald ich einen anderen path angebe, bekomme ich einen Error, da dies anscheinend nicht erlaubt ist.

    Und der wäre? Der Pfad muss logischerweise innerhalb Deiner gewählten open_basedir Einstellung liegen.


    Bei mir funktioniert dieses Beispiel einwandfrei: https://wh8000-nc.fnx.li/session-test/ (Quellcode; Wayback Machine)


    Zum Löschen der alten Sessions sollte sich z.B. folgendes Bashscript als Cronjob eignen, das ist aber ungetestet!

    Shell-Script
    1. #!/bin/bash
    2. # Nach frühestens 61 Minuten werden alte Sessiondateien gelöscht...
    3. # Wenn Du es erst einmal nur testen willst, ersetze -delete durch -print.
    4. find /path/to/your/sessions/ -maxdepth 1 -type f -name 'sess_*' -mmin +61 -delete
    5. exit $?