phpbar.de logo

Mailinglisten-Archive

[php] Schlafende Prozesse / flock() / ignore_user_abort() / file_get_contents()

[php] Schlafende Prozesse / flock() / ignore_user_abort() / file_get_contents()

Mario Haßler M.Hassler at gmx.de
Mo Mär 15 23:37:21 CET 2010


Hallo allerseits!

Entschuldigt bitte den etwas "faserigen" Betreff, aber ich fühle mich
etwas orientierungslos und könnte ein bisschen Hilfe gebrauchen. Ich
versuche es so kurz wie möglich zu halten:

Wenn sich viele Benutzer gleichzeitig auf meiner Seite tummeln, gehen
manche Funktionen in die Knie, z. B. die Suchfunktion. Das liegt meiner
Vermutung nach jedoch nicht an der Suche selbst, sondern daran, dass
der Server eine Vielzahl von "schlafenden" Prozessen ansammelt, und
diese "Karteileichen" den "echten" Prozessen Rechenzeit oder Zugriffs-
rechte abtrünnig machen. (Auch wenn es nicht direkt etwas mit PHP zu
tun hat: Wie kommt es eigentlich zu diesen "schlafenden" Prozessen?
Was machen die? Wachen die irgendwann mal wieder auf oder werden sie
doch noch beendet?)

Ein Problem könnte darin liegen, dass die Suche manche Bereiche der
Seite "indiziert", d. h. eine Art Zusammenfassung erstellt und diese
speichert. (Wenn sich bis zur nächsten Suche nichts ändert, kann die
Zusammenfassung wiederverwendet werden und spart dann Zeit.) Bei den
Dateioperationen benutze ich die flock()-Funktion in ihrer Reinform,
auch wenn mir bewusst ist, dass ein fopen(..., 'w') nicht wirklich dazu
passt. Um das Thema "Abbruch durch den Benutzer" habe ich mich bisher
noch nicht gekümmert. Kann es also sein, dass ein Abbruch nach flock()
die folgenden Prozesse ausbremst, die sich mit flock() auf die gleiche
Datei beziehen? Kann ich das mit ignore_user_abort() in geordnete
Bahnen lenken?

Dann zu flock(): http://www.php.net/manual/de/function.flock.php
bietet in den Benutzerkommentaren viele Anregungen, wie man aus dem
etwas ungeschickten Ansatz, den Zugriff erst nach Öffnen zu sperren,
etwas Brauchbares macht. Ist

   $fp = fopen(..., 'a'); // <- Dateiinhalt erst bewahren
   flock($fp, LOCK_EX);
   ftruncate($fp, 0);     // <- jetzt erst löschen
   fputs($fp, ...);
   flock($fp, LOCK_UN);
   fclose($fp);

der "richtige" Ansatz als Ersatz für fopen(..., 'w') + flock()? Sehe
ich das richtig, dass auch fopen(..., 'r') mit flock() kombiniert
werden muss, damit das Konzept stimmig ist? Und was ist mit Funktionen
wie file_get_contents() / file_put_contents()?

Für Hilfestellung jeder Art bin ich dankbar; auch Hinweise / Vermutun-
gen, dass das Problem vielleicht ganz woanders liegt. Ach ja: Wenn der
Server ganz zu hängen scheint, hilft es manchmal, das Session-Cookie
im Browser zu löschen und die Seite neu zu laden, dann geht's. (Weiß
zwar nicht, ob das irgendetwas mit dem Problem zu tun hat, aber ich
erwähne es lieber mal.)

Vielen Dank im Voraus,

Mario Haßler

php::bar PHP Wiki   -   Listenarchive