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()

Christian Grobmeier grobmeier at gmail.com
Di Mär 16 13:39:40 CET 2010


> 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?

Einen Prozess zu erstellen, dauert Zeit. Damit genug Prozesse
vorhanden sind um Requests zu bearbeiten werden Prozesse manchmal
gepoolt. Der Server entscheidet im allgemeinen wie viele Prozesse er
gerade behält. So ist das zumindest bei den meisten Servern. Ähnliches
funkt mit z. B. Datenbankverbindungen im Java-Bereich. Bei PHP ist
letzteres eher ungewöhnlich


> 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?

Ich glaube, du solltest mal einen meiner Blogartikel lesen:
http://www.grobmeier.de/2009/08/21/performance-ofnonblocking-write-to-files-via-php.html

Soweit ich das jetzt verstehe, bin ich da auch schonmal
drübergestolpert, bei Log4PHP.
Da haben die schreibzugriffe sich gegenseitig blockiert und die
Performance runtergezogen.
Ich würde jetzt vermuten, dass du vielleicht ein ähnliches Problem
hast. In deinem Fall vielleicht sogar so schlimm, dass du in gewisse
Deadlock-Situationen läufst, die den Server so ausbremsen, dass er
irgendwann aufgibt. vielleicht ist deine Prozess-Theorie somit also
doch vielleicht richtig

Da habe ich auch diese ganzen Contents-Methoden ausprobiert.

Lass hören, obs dir was gebracht hat.
Cheers
Christian



>
> 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
> --
> ** Allgemeine deutschsprachige PHP-Liste: php at phpbar.de **
> Informationen: http://www.phpbar.de
> http://lists.phpbar.de/mailman/listinfo/php
>

php::bar PHP Wiki   -   Listenarchive