php sperrt eine gelöschte Sitzungsdatei

9

Unsere php-App, die unter Apache läuft, versucht gelegentlich, eine gelöschte Sitzungsdatei zu sperren. Dadurch hängt der Apache-Prozess und schließlich laufen keine Prozesse mehr.

Der Beweis:

%Vor%

und dann:

lsof, für den gleichen Prozess:

%Vor%

Irgendwelche Ideen, warum dies geschieht? Und was können wir tun, um das zu verhindern?

    
derbexuk 20.02.2012, 16:57
quelle

5 Antworten

3

Ich habe ein Problem mit identischen Symptomen wie bei Ihnen festgestellt, abgesehen davon, ob die Sitzungsdatei gelöscht wurde oder nicht - irrelevant (und möglicherweise auch für Sie) - haben Sie Hinweise darauf, dass das Löschen der Sitzungsdatei mit% co_de zusammenhängt %?).

In meinem Fall war es eine Race-Bedingung für den Zugriff auf die gleiche Session-Datei zwischen zwei Skripten:

  1. flock wird beim Laden korrekt ausgeführt. Es enthält Javascript, das eine XMLHttpRequest an /page1.php .
  2. ausführt
  3. Wenn auf /background.php zugegriffen wird, läuft /background.php , was eine nicht existierende URL ist.
  4. Beim Navigieren zu readfile(http://remote.url) wird das Skript angehalten. Ein strace zeigt /page2.php an, und lsof gibt an, dass er auf Lese- / Schreibzugriff auf eine Sitzungsdatei wartet.

In diesem Szenario warten sowohl flock(89, LOCK_EX als auch /page2.php beide auf der gleichen Sitzungsdatei, aber letzteres war nicht in der Lage, dies zu tun, da es auf das Warten auf /background.php auf Zeitüberschreitung gewartet wurde. Ich habe das in readfile() :

%Vor%

Das Problem war also ein ganz anderes Skript als der wahrgenommene Täter.

Sie können schnell nach diesem Problem suchen, indem Sie alle geöffneten Dateien für die php-Sitzungsdatei ausschließen, um zu sehen, welcher httpd-Prozess sie verwendet:

%Vor%

Wenn zwei httpd-Prozesse auf dieselbe Sitzungsdatei zugreifen, ist dies wahrscheinlich Ihr Problem. Jetzt können Sie überprüfen, was diese Prozesse mit strace machen, oder in meinem Fall war es genug, php_error_log zu verwenden:

%Vor%     
Quinn Comendant 17.04.2014 23:32
quelle
1

Gibt es einen enormen (Client-) Bedarf, die Sitzungsdatei zu löschen? Du solltest das nicht tun. PHP selbst implementiert einen Speicherbereinigungsmechanismus, um nicht mehr funktionierende Sitzungsdateien zu löschen. Es wird viel effizienter als alles, was Sie sonst noch tun könnten schreibe dich mit PHP.

Sie können verwenden:

  1. session_destroy - Löscht alle in einer Sitzung registrierten Daten
  2. session_unset - Alle Sitzungsvariablen freigeben

Und wiederhole session_start ().

Weitere hier .

Aktualisierung:

PHP ist eine sehr saubere Skript-Engine, die keinen Müll auf Ihrem System hinterlässt! Die Sitzungsdateien werden nach Ablauf des Sitzungszeitlimits automatisch gelöscht. session-timeout könnte Fall mit Ihrem System sein, denke ich. Wenn das Timeout auf 20 Minuten eingestellt ist, werden die Dateien 20 Minuten nach dem letzten Zugriff gelöscht. Gleiches gilt für den Cookie. Jedes Mal, wenn eine Seite angefordert wird, ist die Cookie-TTL jetzt auf + 20 Minuten eingestellt.

Sehen Sie sich einige Konfigurationsrichtlinien an. Odds sind, dass Sie gc_maxlifetime auf einen sehr hohen Wert gesetzt haben und sie haben einfach nicht das "Verfalls" -Grenze erreicht, um automatisch gesammelt zu werden. Sie sollten Ihre Anwendungen überprüfen, um sicherzustellen, dass sie während der Laufzeit keine merkwürdigen Werte für die Sitzungseinstellungen festlegen (mit ini_set() ).

PHP verfügt über einen internen Algorithmus, der auf session_start() ausgeführt wird und entscheidet, ob ein Müllbereinigungslauf ausgeführt und alte Sitzungsdateien gelöscht werden sollen. Aus Performancegründen glaube ich, dass die Standardwahrscheinlichkeit, einen Lauf jedes Mal auszuführen, 1% ist, so dass im Durchschnitt eine Müllsammelroutine einmal in jeweils 100 session_start () Aufrufen gestartet wird. Wenn dies nicht genug ist, können Sie den gc_divisor Einstellung auf etwas höher als 1.

    
Somnath Muluk 03.03.2012 18:15
quelle
0

Dies ist wahrscheinlich eher eine Problemumgehung für Ihren Fall, aber warum migrieren Sie Sitzungen nicht komplett vom Dateisystem auf die Datenbank?

Weitere Informationen erhalten Sie hier Ссылка

    
mobius 05.03.2012 14:32
quelle
0

Haben Sie versucht, diese 2 offenen Bugs zu lesen?

Ссылка https://bugs.php.net/bug.php?id=32092

Versuchen Sie session_write_close () (hässliches Workaround) als letzte Zeile aufzurufen oder PHP zu aktualisieren.

    
dAm2K 05.03.2012 17:37
quelle
0

Keine Ahnung, was das für Ihren Fall bedeutet.

Diese Frage hat einige gute Vorschläge bekommen ...

Haben Sie versucht, die Umgebung neu zu installieren oder auf einen anderen Server zu wechseln? Wird es funktionieren, wenn Sie den Standard-Session-Handler außer Kraft setzen und fopen ($ file, 'w') anstelle von fopen ($ file, 'x') verwenden?

Auch die Umgehung der Implementierung eines Session-Handlers basierend auf einer Datenbank gibt es etwa eine Million Anleitungen, um zum Beispiel einen "php and mysql session handler" einzurichten.

    
CodeReaper 29.02.2012 17:33
quelle

Tags und Links