[gelöst] PHP Session Lifetime auf Debian verändern: Wie?

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
Onsemeliot
Beiträge: 9
Registriert: 01.08.2009 16:45:58

[gelöst] PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von Onsemeliot » 28.04.2011 17:36:05

Hallo Debian-Freunde,

ich soll die Dauer der Sessions auf unserem Webserver für jede Domain unterschiedlich bestimmen. Das klingt einfach, aber irgendetwas mache ich offensichtlich seit vielen Tagen falsch.

Auf meiner Informationssuche im Netz habe ich vor allem folgenden Artikel erhellend gefunden:
http://stackoverflow.com/questions/3865 ... to-overrid

Leider hat aber auch er mich nicht ermächtigt die gestellte Aufgabe zu bewältigen.

Habe ich richtig verstanden wie die effektive Session-Dauer zu Stande kommen soll?:

Folgende Variablen in den unterschiedlichen PHP-Konfigurationsdateien sind anscheinend relevant:

Code: Alles auswählen

session.cookie_lifetime = 0
session.gc_probability = 0
session.gc_divisor = 100
session.gc_maxlifetime = 86400
Die oben gesetzten Werte sollten meinem Verständnis nach dafür sorgen, dass die Sessions auf anderen Servern als einem Debian-System nur beendet werden, wenn der Browser geschlossen wird, da ich darin die Garbage Collector Probability auf null gesetzt habe. Damit sollte der Garbage Collector in null von hundert Durchläufen die Session beenden.

Das spielt auf einem Debian-Server (wie unserem) allerdings keine Rolle, denn da sollte die Session wegen einem übergeordneten Cronjob unter: /etc/cron.d/php5 nach etwa 24 Stunden (86400 Sekunden) automatisch beendet werden, da dieser Cronjob unter Debian alle 30 Minuten abläuft. Dabei wird angeblich nur die letzte Variable: session.gc_maxlifetime aus allen php.ini-Dateien ausgelesen und der höchste gefundene Wert verwendet. Die drei anderen Variablen sind damit auf Debian-Servern anscheinend bedeutungslos, da der sonst übliche Garbage Collector aus Sicherheitsgründen bzw. wegen einem fehlenden Schreibrecht im entsprechenden Ordner auf Debian-Servern gar nicht aufgerufen wird.

Das klingt zwar so weit plausibel, aber irgendetwas scheint dennoch anders zu funktionieren weil bisher alle meine Einstellungen wirkungslos geblieben sind. Alle Sessions werden nach etwa einer halben Stunde beendet obwohl die neu gesetzten Werte durchaus bei einem Aufruf von phpinfo() als übernommen angezeigt werden.

In den folgenden PHP-Konfigurationsdateien habe ich ohne jeglichen Effekt die oben genannten Werte gesetzt:
  • /etc/php5/cgi/php.ini
  • /etc/php5/cli/php.ini
  • /usr/lib/php5/lifetime
Und für einen individuellen Test auf eine Einzeldomain bezogen:
  • /var/www/fcgi/domain-name/php5/php.ini
Die ebenfalls in dem Artikel erwähnte datei: /etc/php5/apache2/php.ini gibt es auf unserem Debian-Server gar nicht.

Ich hatte sogar schon den gesamten Cronjob unter: etc/cron.d/php5 auskommentiert. Das hatte ebenfalls keinen Effekt.

Welchen offensichtlich entscheidenden Faktor übersehe ich?

(Vielen Dank an "niemand" für den Hinweis darauf, dass ich Cronjob falsch geschrieben hatte.)
Zuletzt geändert von Onsemeliot am 01.07.2011 15:35:27, insgesamt 2-mal geändert.

DeletedUserReAsG

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von DeletedUserReAsG » 28.04.2011 19:05:53

'phpinfo' kann dir helfen, die richtige *.ini zu finden. Wenn PHP als Modul eingebunden wird, sollte man zusätzlich nach der Änderung den httpd neu starten.

Edit: und das Ding heiß cron, nicht Crone ;)

cu,
niemand

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von rendegast » 28.04.2011 19:28:15

nach etwa 24 Stunden (86400 Sekunden)
Richtig, 86400 Sekunden sind in etwa 24 Stunden ;)
Dabei wird angeblich nur die letzte Variable: session.gc_maxlifetime aus allen php.ini-Dateien ausgelesen und der höchste gefundene Wert verwendet.
"angeblich"? /usr/lib/php5/maxlifetime:

Code: Alles auswählen

#!/bin/sh -e

max=1440

if which php5 >/dev/null 2>&1 && [ -e /etc/php5/apache2/php.ini ]; then
  cur=$(php5 -c /etc/php5/apache2/php.ini -d "error_reporting='E_ALL & ~E_DEPRECATED'" -r 'print ini_get("session.gc_maxlifetime");')
  [ -z "$cur" ] && cur=0
  [ "$cur" -gt "$max" ] && max=$cur
else
        for ini in /etc/php5/*/php.ini; do
          cur=$(sed -n -e 's/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*\([0-9]\+\).*$/\1/p' $ini 2>/dev/null || true);
          [ -z "$cur" ] && cur=0
          [ "$cur" -gt "$max" ] && max=$cur
        done
fi

echo $(($max/60))

exit 0
Der 1/2-stündliche cron-Job:

Code: Alles auswählen

... find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete
die Dauer der Sessions auf unserem Webserver für jede Domain unterschiedlich bestimmen
Ein eigenes maxlifetime-Skript und cron-Job, die die Sache per Domain abarbeiten?
Dafür dann auch die jeweiligen session-Dateien per Domain ablegen.

Zum Test der Interpretation könntest Du eine maxlifetime-Kopie mit Ausgaben angereichert ausführen.

Code: Alles auswählen

        for ini in /etc/php5/*/php.ini; do
          echo $ini preMAX $max
...
          echo $ini CUR $cur MAX $max
        done
Vielleicht stolpert 'find' über die '-cmin 1440' (1Tag)?

Code: Alles auswählen

find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete
->
echo find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -ls
find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -ls
Die ebenfalls in dem Artikel erwähnte datei: /etc/php5/apache2/php.ini gibt es auf unserem Debian-Server gar nicht.
In dem Fall wird dann auf die anderen /etc/php5/*/php.ini zurückgegriffen, siehe obiges maxlifetime.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Onsemeliot
Beiträge: 9
Registriert: 01.08.2009 16:45:58

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von Onsemeliot » 29.04.2011 17:50:26

Hallo niemand und rendegast,

jetzt habe ich unter Zuhilfenahme diverser anderer Quellen Stunden lang Eure Rückmeldungen erforscht und eine Antwort verfasst aber leider vergessen den Text in den Zwischenspeicher zu laden, bevor ich ihn abgesendet habe. Deswegen ist jetzt alles verloren. (Hier im Forum ist die Session Lifetime anscheinend auch kürzer als für mich gut gewesen wäre.)

Vielen Dank für Eure hilfreichen Rückmeldungen. Ich habe viel daraus gelernt.

Ich bin mir noch nicht sicher ob ich es mir zutrauen soll Deinen gut dargelegten Vorschlag zu versuchen, rendegast, da ich dann ja tatsächlich in mir nur teilweise nachvollziehbaren Zusammenhängen herumwühlen würde. Es wäre sehr schlecht, wenn ich die Funktionstüchtigkeit längst bestehender Webseiten gefährde, die ich nicht selbst aufgebaut habe und wo ich als blutiger Anfänger in diesen Dingen deswegen eventuelle Wechselwirkungsfehler erst nach langem Forschen finden und beheben könnte.

Auch um Session-Dateien per Domäne abzulegen zu können, müsste ich weiter nachforschen. (Mir war bisher nämlich nicht mal klar, dass dies nicht sowieso der Fall ist.) Die Kette der zu berücksichtigenden wird Dinge länger und länger. Wenn ich geahnt hätte, dass zur domänenspezifischen Anpassung von Session-Laufzeiten - zumindest auf Debian-Servern - eigene Konfigurationsdateien angelegt und Shell-Skripte geschrieben werden müssen anstatt einfach die passende Variable zu ändern, hätte ich vermutlich gleich einen erfahrenen Administrator gesucht...

Es ist nicht so, dass mich das nicht interessieren würde, aber ich denke meinem Chef ist meine Weiterbildung dann doch weniger wichtig als das wirtschaftlichliche Überleben.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von rendegast » 29.04.2011 21:07:23

Auch um Session-Dateien per Domäne abzulegen zu können, müsste ich weiter nachforschen.
Die Dateien liegen nach dem cron-Job wohl unterhalb von /var/lib/php5/.
Ob es eine Direktive dafür gibt, vielleicht mit

Code: Alles auswählen

php -i  |  egrep -i "sess|var|lib/php5"
führt u.a. zu

Code: Alles auswählen

session.cookie_path => / => /
session.save_path => /var/lib/php5 => /var/lib/php5

/usr/lib/php5/maxlifetime sucht nominell ja nur in /etc/php5/*/php.ini nach "session.gc_maxlifetime".
Nun verwendet Ihr ja dom-spezifische php.ini:
Und für einen individuellen Test auf eine Einzeldomain bezogen:
* /var/www/fcgi/domain-name/php5/php.ini
Auf Domänen heruntergebrochen mit obigem
session.save_path = /var/lib/php5/DOMÄNE
EDIT -------------------
Besser
session.save_path = /var/lib/php5_domains/DOMÄNE (oder ähnlich),
da es dann keine eventuelle Überschneidung mit dem ursprünglichen cron-Job gibt.
-------------------------
in den jeweiligen php.ini, oder in einer ausgelagerten eigenen Datei in sowas:
Loaded Configuration File => /etc/php5/cli/php.ini
Scan this dir for additional .ini files => /etc/php5/cli/conf.d
Additional .ini files parsed =>
...
(nur halt bezüglich der Domänen-php.ini)
EDIT -------------------
Das im (dann aber root gehörenden) /var/www/fcgi/$DOM/php5/conf.d/ unterzubringen hätte den Vorteil,
daß der Domänen-Admin nicht den beabsichtigten Wert überschreiben kann.
Um conf.d/ zu schützen, dürften auch
$DOM/
$DOM/php5/
nur für root schreibbar sein.
(Falls /var/www/fcgi/$DOM/php5/conf.d/*.ini überhaupt ausgewertet werden)
-------------------------


Dann braucht es nur noch ein kleines regelmäßig aufgerufenes Skript ala:

Code: Alles auswählen

#!/bin/sh -e

max=1440

LIST="
dom1=15000
dom2=12000
dom3=10000
dom4=7000
dom5=1000
"

#  for ini in /etc/php5/*/php.ini; do
#  cur=$(sed -n -e 's/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*\([0-9]\+\).*$/\1/p' $ini 2>/dev/null || true);

        for ini in $LIST; do
          cur=${ini#*=}           # ${ini##*=}
          DOM=${ini%=*}           # ${ini%%=*}

          [ -z "$cur" ] && cur=0
          #[ "$cur" -gt "$max" ] && max=$cur
          [ "$cur" -lt "$max" ] && cur=$max

         #echo $ini CUR $cur MAX $max
          #find /var/lib/php5/$DOM/ -type f -cmin +$(($cur/60)) -ls
          find /var/lib/php5/$DOM/ -type f -cmin +$(($cur/60)) -delete
        done

exit 0
Die LIST kann auch in einer eigenen Datei stehen, welche eingelesen wird.
Der Einfachheit halber im Format 'Domäne=Wert', da Leerstellen usw. schwieriger zu parsen sind,
hier einfach mit Parameter-Expansion.
Das jeweilige $cur ist der ausschlaggebende Wert für einen domäneneigenen 'find'-Durchlauf.
$max ist nur noch ein Minimalwert.
Zuletzt geändert von rendegast am 07.05.2011 16:17:42, insgesamt 2-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Onsemeliot
Beiträge: 9
Registriert: 01.08.2009 16:45:58

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von Onsemeliot » 30.04.2011 13:36:33

Hallo rendegast,

herzlichen Dank für Deine standhaften Bemühungen mir weiter zu helfen. Du machst es mir wirklich leicht die Dinge besser verstehen zu lernen. - Auch wenn ich offensichtlich einen weiten Weg zu beschreiten habe.

Code: Alles auswählen

php -i | grep -Ei "sess|var|lib/php5"
Dieser Befehl bringt auch bei mir exakt die von Dir vorhergesagten Ausgaben.

Ok, den session.save_path sollte ich problemlos in der jeweiligen Domänen-php.ini (/var/www/fcgi/domain-name/php5/php.ini) auf: /var/lib/php5/domain-name/php5 setzen können. So weit, so gut.

(Ich nehme an ich kann dabei den "session.maxlifetime"-Wert ignorieren, da das von Dir vorgeschlagene Skript ohnehin diese Werte ersetzt.)

Wenn ich das von Dir vorgeschlagene Skript in jeder Domäne zum Beispiel alle 30 Minuten automatisch aufrufen will, brauche ich dazu wohl für jede Domäne noch einen Cronjob, der das automatisch erledigt. Wie könnte es anders sein?: Ich muss dazu wohl auch erst noch lernen wie ich so einen Cronjob definiere.

Sieht folgender Befehl für Dich sinnvoll aus?:

Code: Alles auswählen

30 * * * * find /var/www/fcgi/domain-name/php5/ -type f -cmin +$(/var/www/fcgi/domain-name/php5/maxlifetime) -delete >/dev/null 2>&1
Diese Zeile müsste ich dann also über den Befehl crontab -e für jede Domäne in meine Cronjob-Liste eintragen. Oder habe ich da etwas falsch verstanden?

Hm, ich habe gerade noch einmal nachgeshen: In dem Skript von Dir könnte immer noch ein Cronjob mit definiert sein. Ich schließe das aus der Umleitung der Ausgabe auf /dev/null, aber inmitten der vielen mir krypisch erscheinenden Zeichen bin ich mir nicht sicher, ob das tatsächlich so ist. (Es muß ja nicht eine Cronjob-Ausgabe sein, die Du hier ins Nirvana schickst.) Und können Cronjobs überhaupt anders als über crontab -e definiert werden?

Die in Deinem Skriptvorschlag für "dom1" bis "dom5" angegebenen Zahlen sind die jeweiligen Session Lifetime-Angaben, nicht wahr? (Dass die Zahlen laufend kleiner werden ist ein Zufall und hat keine Bedeutung, oder?)

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von rendegast » 30.04.2011 19:52:23

Wenn ich das von Dir vorgeschlagene Skript in jeder Domäne zum Beispiel alle 30 Minuten automatisch aufrufen will, brauche ich dazu wohl für jede Domäne noch einen Cronjob, der das automatisch erledigt.
Nein, da das Skript in der Schleife schon die jeweiligen session-Verzeichnisse der Domänen durchsucht.
Sieht folgender Befehl für Dich sinnvoll aus?:
Code: Alles auswählen
30 * * * * find /var/www/fcgi/domain-name/php5/ -type f -cmin +$(/var/www/fcgi/domain-name/php5/maxlifetime) -delete >/dev/null 2>&1
Nein, zuerst mal läuft der Job nur jede Stunde, um *:30.
"find /var/www/fcgi/domain-name/php5/",
ich denke nicht, daß die session-Dateien der domain im webspace der domain liegen sollten. Sicherheitsrisiko?
Diese Zeile müsste ich dann also über den Befehl crontab -e für jede Domäne in meine Cronjob-Liste eintragen. Oder habe ich da etwas falsch verstanden?
Falsch verstanden, die komplette Aufgabe wird durch das Skript allein erledigt.
Also die jeweiligen session-Dateien nach der jeweiligen "maxlifetime" zu suchen.

Eher so, als zBsp. /etc/cron.d/php5_domainselect:

Code: Alles auswählen

08,38 *     * * *     root   [ -x /usr/local/sbin/arbeitsskript ] && [ -d /var/lib/php5 ] && /usr/local/sbin/arbeitsskript
und in der Datei /etc/cron.d/php5 den Job auskommentieren.
Oder die /etc/cron.d/php5 "wegsichern",
dann aber bei Upgrades des php auf deren eventuelles Wiederauftauchen achten und auf Veränderungen sichten.




In dem Skript von Dir könnte immer noch ein Cronjob mit definiert sein. Ich schließe das aus der Umleitung der Ausgabe auf /dev/null, aber inmitten der vielen mir krypisch erscheinenden Zeichen bin ich mir nicht sicher, ob das tatsächlich so ist.

Dann etwas erklärender:

Code: Alles auswählen

#  for ini in /etc/php5/*/php.ini; do
#  cur=$(sed -n -e 's/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*\([0-9]\+\).*$/\1/p' $ini 2>/dev/null || true);
Die Zeilen sind auskommentiert und nur zum Vergleich mit dem Abschnitt aus maxlifetime noch vorhanden.

Code: Alles auswählen

        for ini in $LIST; do
          cur=${ini#*=}           # ${ini##*=}
          DOM=${ini%=*}           # ${ini%%=*}
Der Beginn der Arbeitsschleife,
$ini bekommt für jede der Positionen aus LIST deren Bedeutung,
zBsp. als erstes bekäme ini die Bedeutung "dom1=15000".
Daraus werden mit 'Parameter Expansion' ('man bash', gilt aber auch für die einfache sh) neue Variablen erstellt.
Der Teil dahinter ist wieder auskommentiert "#" und wird nicht ausgewertet.
(das ist die sogenannte "gierige" Version, falls ini aus mehreren Gleichheitszeichen bestünde (war nur zum Test dort))

Code: Alles auswählen

          [ -z "$cur" ] && cur=0
          #[ "$cur" -gt "$max" ] && max=$cur
          [ "$cur" -lt "$max" ] && cur=$max
Wieder ein auskommentierter Teil des Skriptes 'maxlifetime',
dessen Bedeutung sich in diesem Skript verändert.
In 'maxlifetime' wird getestet, ob $cur größer ist als der Wert $max=$cur aus der vorher ausgewerteten php.ini,
um max dann gegebenenfalls an den höheren Wert anzupassen.
In diesem Skript bekommt max aber die Bedeutung einer unteren Schranke für die Löschhäufigkeit,
in diesem Fall ist max=1440, was 24 Minuten entspricht (und behält auch diesen Wert im Skript).
Dazu paßt auch die halbstündige Ausführung des ursprünglichen cron-Jobs:
Wenn ich nur alle halbe Stunde nachsehe, wäre eine nominelle Begrenzung der PHP-Session auf zBsp. 5min unsinnig.

Code: Alles auswählen

         #echo $ini CUR $cur MAX $max
          #find /var/lib/php5/$DOM/ -type f -cmin +$(($cur/60)) -ls
          find /var/lib/php5/$DOM/ -type f -cmin +$(($cur/60)) -delete
        done
Das auskommentierte 'echo' stammt aus der Testphase um die Werte auszugeben.
Das auskommentierte 'find' ebenfalls, es listet die betroffenen Dateien nur auf,
wogegen die Direktive '-delete' die Dateien tatsächlich löscht.




----------------------------------------
Ich frage mich gerade, ob session.gc_maxlifetime für PHP eine weitere Bedeutung hat,
als über so etwas wie 'maxlifetime' einer einfachen Löschroutine übergeben zu werden.
Habe aber auf php.net nichts anderes gefunden.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Onsemeliot
Beiträge: 9
Registriert: 01.08.2009 16:45:58

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von Onsemeliot » 02.05.2011 14:03:05

Vielen Dank, rendegast.

Ich möchte die Lebensdauer der Sessions pro Domain möglichst so setzen, dass bei einer Aktualisierung der Software keine Komplikationen entstehen. Nach Deinen geduldigen Erklärungen mit wertvollen Codeschnipseln habe ich den Eindruck, dass mich folgende Schritte zum Ziel führen müssten:

1) In den php.ini-Dateien der jeweiligen Domänen (/var/www/fcgi/domain-name/php5/php.ini) den session.save_path auf einen Ort außerhalb des jeweilgen Webspaces verändern (z.B.: /var/www/fcgi/domain-name), damit die für die jeweiligen Domänen angelegten Session-Dateien unterschiedlich gehandhabt werden können.

2) Dann eine Sicherungskopie vom Skript unter: /usr/lib/php5/maxlifetime machen.

3) Das aktiv verwendete Skript unter: /usr/lib/php5/maxlifetime auf die folgenden Angaben verändern:

Code: Alles auswählen

#!/bin/sh -e

max=1440

LIST="
dom1=15000
dom2=12000
dom3=10000
dom4=7000
dom5=1000
"
        for ini in $LIST; do
          cur=${ini#*=}
          DOM=${ini%=*}

          [ -z "$cur" ] && cur=0
          [ "$cur" -lt "$max" ] && cur=$max

          find /var/lib/php5/$DOM/ -type f -cmin +$(($cur/60)) -delete
        don

exit 0
5) Den Webserver mit apache2ctl restart neu starten.

Die Cron-Job-Datei muß ich wohl nicht verändern, so lange meine Sessions mindestens eine halbe Stunde dauern sollen, wenn ich das von Dir vorgeschlagene Skript wieder unter: /usr/lib/php5/maxlifetime speichere.

Optimal erschiene es mir wenn die Session Laufzeit nicht in der zentralen Datei: /usr/lib/php5/maxlifetime bestimmt werden würde, sondern tatsächlich aus den jeweiligen php.ini-Dateien über die Variable session.gc_maxlifetime eingelesen werden würde.

Damit müsste das Skript vermutlich näher am Original als Dein Vorschlag sein. Allerdings ist es auch genau das Skript, bei dem ich die Syntax immer noch am wenigsten verstehe.

Vom Ablauf her wäre es daher aus meiner Sicht ideal alle unter /var/www/fcgi/ gelisteten Ordner als Domänen-Namen (DOM) einzulesen und die jeweils in den entsprechenden php.ini-Dateien angegebenen "session.gc_maxlifetime"-Werte als effektive Session-Lifetimes (cur) zu verwenden.

Bisher scheitere ich schon daran die Ausgabe eines simplen "ls"-Befehls für die weitere Verwendung im Skript in ein Array zu schreiben...

Langsam komme ich mir wirklich doof vor. Es wäre wohl sinnvoller ganz einfach anzufangen und nicht schon mit echten Aufgaben zu beginnen, die gelöst werden sollen. So macht das anscheiend nicht sehr viel Sinn, da ich einfach für jede banale Kleinigkeit zu lange brauche um etwas hin zu bekommen und ohne Dich offenbar sowieso völlig verloren wäre. *seufz*

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von rendegast » 02.05.2011 16:12:40

den session.save_path auf einen Ort außerhalb des jeweilgen Webspaces verändern (z.B.: /var/www/fcgi/domain-name), damit die für die jeweiligen Domänen angelegten Session-Dateien unterschiedlich gehandhabt werden können.
Da habe ich im Skript /var/lib/php5/$DOM/ gesetzt,
Aber zBsp. /var/lib/php5_domains/$DOM/ wären wohl passender.
Denn dann könnte der ursprüngliche cron-Job /etc/cron.d/php5 immer noch in /var/lib/php5/ wüten,
und es gibt keine Überschneidung.

Die /var/lib/php_domains/$DOM/ müßten wohl von Hand angelegt werden, dabei auf die Rechte achten,
sie sollten gleich dem ursprünglichen Verzeichnis /var/lib/php5/ sein:

Code: Alles auswählen

# ls -ld /var/lib/php5/
drwx-wx-wt 2 root root 4096 Sep  7  2009 /var/lib/php5/
Einfach geht das mittels

Code: Alles auswählen

cp -a /var/lib/php5 /var/lib/php5_domains
cp -a /var/lib/php5 /var/lib/php5_domains/dom1
cp -a /var/lib/php5 /var/lib/php5_domains/dom2
...


2) Dann eine Sicherungskopie vom Skript unter: /usr/lib/php5/maxlifetime machen.
3) Das aktiv verwendete Skript unter: /usr/lib/php5/maxlifetime auf die folgenden Angaben verändern:
Lasse diese unverändert.
Mit der hierüber vorgeschlagenen Änderung dient das Gespann
/etc/cron.d/php5 + /usr/lib/php5/maxlifetime noch als Aufputzer für nicht berücksichtigte Domänen.

Das aktiv verwendete Skript als zBsp. /etc/php5/domputzer,
der dazu passende cron-Job zBsp. /etc/cron.d/php5_domains

Code: Alles auswählen

08,38 *     * * *     root   [ -x /etc/php5/domputzer ] && [ -d /var/lib/php5_domains ] && /etc/php5/domputzer
Damit steckt das Skript, das mit seiner LIST ja auch eine Konfigurationsdatei ist,
passend im php5-Konfigurationsverzeichnis.
Wo es aber letztendlich untergebracht wird oder wie es heißt, ist recht egal,
der Pfad im cron-Job muß dazu nur passend gesetzt sein.
(Es sollte aber nicht *.ini oder *.conf heißen)


Optimal erschiene es mir wenn die Session Laufzeit ... aus den jeweiligen php.ini-Dateien über die Variable session.gc_maxlifetime eingelesen werden würde.
Damit müsste das Skript vermutlich näher am Original als Dein Vorschlag sein.
Jedoch muß das dann die jeweilige php.ini wiederum sauber nach dem String und seinem Wert parsen.
Dagegen finde ich die Angabe in der LIST einfacher nachzuvollziehen wegen
"Allerdings ist es auch genau das Skript, bei dem ich die Syntax immer noch am wenigsten verstehe."
Zudem ist die Konfig für alle Zeiten dann an einem Ort.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Onsemeliot
Beiträge: 9
Registriert: 01.08.2009 16:45:58

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von Onsemeliot » 02.05.2011 17:19:28

Ich bin ganz Deiner Meinung: Es ist deutlich besser Abänderungen nach Möglichkeit so zu machen, dass sie die bestimmt gut ausgeknobelten Standardabläufe nicht unnötig stören.

Die Definition über die LIST verstehe ich eindeutig leichter. Der Vorteil am Verwenden der gewöhnlichen der php.ini-Dateien ist allerdings der, dass die Einstellung so weiterhin über die anscheinend ursprünglich dafür vorgesehene Variable möglich wäre und die einzelnen Domänenbesitzer mit dem ausschließlichen Zugriff auf die eigenen Ordner auskommen würden. Anpassungen für eine Domäne können so andere am selben Server liegende Domänen nicht beeinflussen...

Ich bin ein Glückspilz auf so einen ebenso geduldigen wie kompetenten Ratgeber wie Dich getroffen zu sein.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von rendegast » 02.05.2011 18:29:08

Der Vorteil am Verwenden der gewöhnlichen der php.ini-Dateien ist allerdings der, dass die Einstellung so weiterhin über die anscheinend ursprünglich dafür vorgesehene Variable möglich wäre
und die einzelnen Domänenbesitzer mit dem ausschließlichen Zugriff auf die eigenen Ordner auskommen würden.
Sowas habe ich gar nicht erwogen, sorry.
Dann /etc/php5/domputzer:

Code: Alles auswählen

#!/bin/sh -e

max=1440

for DOMAIN in /var/www/fcgi/* ; do
          DOM=$(basename $DOMAIN)
          ini=/var/www/fcgi/$DOM/php5/php.ini

          cur=$(sed -n -e 's/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*\([0-9]\+\).*$/\1/p' $ini 2>/dev/null || true);

          [ -z "$cur" ] && cur=0
          [ "$cur" -lt "$max" ] && cur=$max

          find /var/lib/php5_domains/$DOM/ -type f -cmin +$(($cur/60)) -delete
        done

exit 0

Code: Alles auswählen

for DOMAIN in /var/www/fcgi/* ; do
Könnte Probleme machen, falls dort nicht nur die Domänenverzeichnisse wären,
sondern zBsp. auch irgendwelche Dateien.
Eine denkbare Verfeinerung

Code: Alles auswählen

for DOMAIN in $(find /var/www/fcgi/domain-name/ -maxdepth 1 -mindepth 1 -type d) ; do

EDIT Korrektur
for DOMAIN in $(find /var/www/fcgi/ -maxdepth 1 -mindepth 1 -type d) ; do
Sollte nur Verzeichnisse listen in genau diesem Verzeichnis, nicht rekursiv,
und ohne das Verzeichnis selbst.
Andernfalls wäre auch wieder die Angabe einer expliziten Liste möglich,
falls Du dieses Feature nicht jeder Domäne zur Verfügung stellen möchtest.

Code: Alles auswählen

DOMAINLIST="
/var/www/fcgi/dom1
/var/www/fcgi/dom2
/var/www/fcgi/dom3
"
for DOMAIN in $DOMAINLIST ; do
...
Zuletzt geändert von rendegast am 07.05.2011 11:50:57, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Onsemeliot
Beiträge: 9
Registriert: 01.08.2009 16:45:58

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von Onsemeliot » 03.05.2011 14:08:51

rendegast hat geschrieben:Sowas habe ich gar nicht erwogen, sorry.
Hui, na Du hast ja wirklich keinen Anlass Dich zu entschuldigen.
rendegast hat geschrieben:... Könnte Probleme machen, falls dort nicht nur die Domänenverzeichnisse wären, sondern zBsp. auch irgendwelche Dateien.
Das Problem habe ich im Moment zwar nicht, aber es ist natürlich immer gut zur Sicherheit auch suboptimale Fälle abzufangen...

Sobald ich wieder einen ruhigen Moment finde mich konzentriert um die Geschichte zu kümmern, werde ich endlich die von Dir erläuterten Möglichkeiten (bei zuerst einmal einer nicht so heiklen Domain) versuchen und mich mit einem Statusbericht zurück melden.

Herzlichen Dank noch einmal - und auf Bald.

Ich würde wünschen auch ich könnte mit meinen Ratschlägen irgendjemandem so hilfreich sein. (Falls Du irgendwann Hilfe mit Grafik Design brauchst und niemanden zur Hand hast, der Dir helfen kann, scheue bitte nicht davor zurück mich zu fragen! Das ist ein Gebiet in dem ich deutlich mehr Plan haben sollte. Du hast auf jeden Fall etwas gut bei mir.)

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von rendegast » 07.05.2011 16:50:00

Das Skript ist weiter verbesserungsfähig,

- Es könnten/müßten auch conf.d/*.ini berücksichtigt werden

- session.save_path müßte vor Veränderung geschützt sein.

- cur=$(sed ... ) in der Form ist anfällig, falls session.gc_maxlifetime einfach mehrmals auftaucht

Code: Alles auswählen

cur=$(sed ... $ini 2>/dev/null || true);
->
cur=$(sed ... $ini 2>/dev/null | tail -n1 || true);
- weitere Fehler- und Abbruchbehandlungen, durch das '#!/bin/sh -e' reagiert das Skript sehr empfindlich.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Onsemeliot
Beiträge: 9
Registriert: 01.08.2009 16:45:58

Re: PHP Session Lifetime auf Debian verändern: Wie?

Beitrag von Onsemeliot » 11.05.2011 15:40:32

Danke, noch mal.

Leider hatte ich noch keine Gelegenheit Deinen Ratschlägen in aller Ruhe zu folgen.

Ich melde mich zurück, wenn ich endlich mehr weiß...

Onsemeliot
Beiträge: 9
Registriert: 01.08.2009 16:45:58

Re: PHP Session Lifetime auf Debian verändern: So!

Beitrag von Onsemeliot » 01.07.2011 15:34:52

Endlich bin ich dazu gekommen den von rendegast vorgeschlagenen Lösungsweg mit dem "Domputzer"-Skript zu versuchen. Es hat damit endlich funktioniert. Ich bin dadurch nämlich auch auf das Problem aufmerksam geworden, das alle meine Änderungsversuche vorher gegenstandslos gemacht hatte: Mein Vorgänger hatte den Speicherort der Sessions aus mir unbekannten Gründen verändert. Daher waren auch alle meine Versuche bisher vergeblich. Ich hatte vorher nicht die Idee, dass der Speicherort verändert worden sein könnte. (Besonders weil er mir versichert hatte, dass er die Session-Einstellungen nicht verändert hatte.)

Da ich nun den Speicherort der Sessions kenne, sollte es auch möglich sein Logins, die mehr als die üblichen 24-48 Minuten dauern sollen, direkt über den Wert "session.gc_maxlifetime" in den jeweiligen php.ini-Dateien zu definieren. (Dann wäre das Domputzer-Skript gar nicht nötig weil die Aufgabe auch gut vom Originalskript erledigt werden kann, wenn ich alle Sessions in den ursprünglich vorgesehenen Ordnern ablege.)

Optional ist es natürlich möglich auch kürzere Login-Zeiten zu realisieren wenn ich den Standard-Cronjob so abändere, dass das Löschskript öfter als nur alle 24 Minuten aufgerufen wird.

Herzlichen Dank noch einmal, rendegast. Durch Deine ausführlichen Erklärungen und Skripts habe ich viel gelernt. :idea: :THX:

Antworten