How-to: Optimieren der PHP-Sessionverwaltung

Bei unserer Serverumstellung ist uns ein merkwürdiges Verhalten auf unseren Servern aufgefallen. Nach unserer Analyse fanden wir ein Programm, welches sehr starke Auslastungen verursachte. In diesem How-to erklären wir dir, wie du unsere Lösung für dieses Problem anwenden kannst.

Ein Server beantwortet rund um die Uhr alle möglichen Anfragen, die an ihn gestellt werden. Gewisse Anfragen kann der Server nur mit sogenannten Sessions beantworten. Eine Session speichert gewisse Informationen auf dem Server, so dass der Server weiss, wer mit ihm spricht. Dies ist zum Beispiel notwendig, wenn sich einer unserer Autoren einloggt, um einen Artikel zu schreiben. Die Information, dass sich der Autor Hans Muster auf dem Server eingeloggt hat, wird in einer Datei gespeichert. Sobald der Autor seine Arbeit beendet, werden die Informationen auf dem Server gelöscht. Die Datei, welche nach dem Löschen der Daten leer ist, bleibt jedoch auf dem Server bestehen.

Hohe Auslastung in regelmässigen Abständen

Alle halbe Stunde erfolgt die Löschung dieser Dateien. Die Löschung der Datei übernimmt ein kleines Programm. Das Programm wird von unserem Betriebssystem bei der Installation von PHP installiert und prüft bei jeder leeren Datei, wie alt die Datei ist. Wenn ein gewisses Alter überschritten ist, wird die Datei gelöscht. Aufgrund der zeitlichen Abstände zwischen den Auslastungsspitzen auf den Servern konnten wir dieses Programm als Verursacher identifizieren. Wir haben daraufhin das Programm mehrmals manuell ausgeführt und mussten feststellen, dass das Programm für das Löschen der Dateien ungefähr 30 Sekunden brauchte.

Wir haben kurzerhand selber ein kleines Programm geschrieben, welches die gleichen Dateien löscht. Das Programm erledigt genau die gleichen Schritte wie das Original-Programm. Die Resultate waren überzeugend. Für die gleiche Arbeit brauchte unser eigenes Programm nur etwa eine Sekunde. Mit unserem eigenen Programm können wir pro Server und Tag ungefähr 24 Minuten an Auslastung sparen. Auf alle Server gerechnet können wir pro Tag so mehrere Stunden sparen.

Aus diesem Anlass möchten wir die Schritte veröffentlichen, die notwendig sind um das Original-Programm mit unserem Programm zu ersetzten. Im Internet konnten wir dieses Problem bislang nicht finden. Falls Du das gleiche Problem hast wie wir, hoffen wir, Dir mit unserer Lösung weiterhelfen zu können.

Technisches:

  • Das Problem tritt nur auf, wenn Du eigene Server betreibst. Falls Du ein Shared Hosting verwendest, musst Du dir keine Gedanken machen.
  • Das Original-Programm wird von Debian und Ubuntu bei der Installation von PHP mitgeliefert. Falls Du diese Kombination nicht verwendest, bist Du von diesem Problem nicht betroffen.

Rechtliches:

  • Wir übernehmen keine Verantwortung für die korrekte Funktionsweise.
  • Wir bieten Dir für dieses Problem und diese Lösung keinen Support an.
  • Du solltest der Anleitung nur folgen, wenn Du weisst, welche Schäden durch (Bedienungs-)Fehler ausgelöst werden können.

Anleitung:

  1. Erstelle im Ordner „/usr/lib/php5/“ eine neue Datei, welche Du am besten „remove-session-files.php“ nennst. Den Namen kannst Du jedoch frei wählen.
  2. Füge den folgenden PHP-Code in dieser Datei ein:
    #!/usr/bin/php5
    <?php
    
    $directory = new DirectoryIterator('/var/lib/php5');
    $maxLifeTime = ini_get('session.gc_maxlifetime');
    
    foreach ($directory as $file) {
        if ($file->isDot()) {
            continue;
        }
    
        if ($file->getCTime() < time() - $maxLifeTime) {
            unlink($file->getPathname());
        }
    }
  3. Mache die Datei ausführbar, indem Du folgendes ausführst:
    • Debian: chmod +x /usr/lib/php5/remove-session-files.php
    • Ubuntu: sudo chmod +x /usr/lib/php5/remove-session-files.php
    • Falls Du die Datei an einem anderen Ort abgespeichert hast, musst Du den Pfad dementsprechend anpassen.
  4. Bearbeite die Datei „/etc/cron.d/php5“ und die Zeile 09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) –delete durch folgende Zeile ersetzten: 09,39 * * * * root /usr/lib/php5/remove-session-files.php Auch hier gilt: Falls Du der Datei einen anderen Namen gegeben hast, musst Du die Zeile dementsprechend anpassen.
  5. Du hast das Original-Programm erfolgreich mit unserem Programm ersetzt. In der Zukunft solltest Du in den Minuten 9 und 39 jeder Stunde eine deutlich kleinere Auslastung registrieren.

Matthias Zobrist

Matthias Zobrist ist Software-Entwickler bei Blogwerk AG.

 

Schreiben Sie einen Kommentar

Wir sind sehr an einer offenen Diskussion interessiert, behalten uns aber vor, beleidigende Kommentare sowie solche, die offensichtlich zwecks Suchmaschinenoptimierung abgegeben werden, zu editieren oder zu löschen. Mehr dazu in unseren Kommentarregeln.

Pflichtfelder
OK
Bitte geben Sie Ihren Namen ein.
OK
Bitte geben Sie Ihre E-Mail-Adresse ein.
OK
Bitte geben Sie einen korrekte Website ein.
OK
Bitte geben Sie einen Kommentar ein.