[ erweiterte Suche ]

»flock() Alternative mkdir() optimiert

PHP constant: Nicht gesetzt, obwohl definiertNeues Thema eröffnenNeue Antwort erstellenDas Thema einem Freund empfehlenDas Thema druckenVerlinkung abgrenzen funktioniert nicht
Seite 1 von 1 [1 Beitrag]
AutorNachricht
Administrator 


Name: Marc
Geschlecht:
Anmeldedatum: 28.08.2004
Beiträge: 43942
Chats: 11135
Wohnort: Hennef


Meine eBay-Auktionen:


Hi,

nach diversen Tests kann ich sagen, dass flock() ein Performancekiller ist.

Nicht weil der Befehl an sich langsam ausgeführt wird, sondern weil es schnell zu Staus kommt, wenn hunderte verschiedene Prozesse parallel einen flock() ausführen.

Erstmal zu unserer Testumgebung:
Wir haben eine Community mit ca. 100.000 Impressionen pro Tag (Du bist gerade hier ;)). Um die Datenbank zu entlasten, nehmen wir die häufigsten Datenbankabfragen, die sich so gut wie nie ändern und hinterlegen sie in einem Cache. Aktuell nutzen wir dazu einen filecache.

Das Ergebnis der Abfrage kommt also in eine Datei:
   Code:
	function mkfile($filename, $data='', $chmod=0644) {
$h = @fopen($filename, 'w');
@fwrite($h, $data);
@fclose($h);
@umask(0000);
@chmod($filename, $chmod);
return $data;
}


Nun stellt man sich vor, dass sich das Abfrageergebnis ändert. Der Cache muss also aktualisiert werden. Jetzt kommt das Problem. Innerhalb von einer Sekunde können theoretisch mehrere hundert Besucher den Cache neu erstellen. Umso mehr Daten in der Cachedatei liegen, umso häufiger resultieren parallele Schreibvorgänge.

Es gibt nun zwei Lösungsansätze für dieses Problem:
A) der Cache wird immer nur von einem Besucher aktualisiert z.B. wenn der Administrator die Seite nutzt.
B) man sperrt die Datei, solange der Schreibprozess stattfindet

Üblicherweise nutzt man zum Sperren von Dateien die Funktion flock(). Liest man nun die zahlreichen Kommentare bei php.net stellt man fest, dass sich viele über Probleme bei gespiegelten Systemen bzw. Timeoutprobleme äußern:
http://php.net/manual/de/function.flock.php

Daraus resultieren verschiedene Lösungsansätze mit LOCK_NB und sogar $wouldblock:
   Code:
	function mkfile($filename, $data='', $chmod=0644) {
if (($h = @fopen($filename, 'w')) && flock($h, LOCK_EX | LOCK_NB, $wouldblock) && !$wouldblock) {
@fwrite($h, $data);
@fclose($h);
@umask(0000);
@chmod($filename, $chmod);
flock($h, LOCK_UN);
return $data;
}
}


Allerdings haben unsere Tests ergeben, dass auch das mangelhaft ist. Denn obwohl LOCK_NB angeblich ein Timeout verhindert, so haben wir festgestellt, dass das nicht der Fall ist. Und manchmal ist der Prozess kaum aufzuhalten. So als würden hunderte Dateihandles im Raum schweben und auf alle muss noch ein flock() angewendet werden. Soll heißen, dass der PHP Prozess den Server sogar zum Absturz gebracht hätte, wenn wir das Script nicht gekickt hätten.

Aber in den Kommentaren war auch ein Hinweis auf mkdir() bzw. ich fand dazu diesen Thread bei stackoverflow:
http://stackoverflow.com/questions/6967553/php-flock-alternative

Auch das habe ich dann natürlich getestet. Allerdings war auch hier das Ergebnis ernüchternd. Scheinbar wurde auch hier hundertfach parallel mkdir() ausgeführt und die Abarbeitung dessen führte ebenfalls zum Timeout.

Aber das Problem konnte ich schnell lösen, in dem ich mit file_exists() zuerst prüfte, ob mkdir() etwas geschrieben hat. Und damit kommen wir zu meiner finalen Empfehlung:
   Code:
	function mkfile($filename, $data='', $chmod=0644, $flock=false) {
if (($h = @fopen($filename, 'w')) && (!$flock || (!file_exists($filename . '_lock') && @mkdir($filename . '_lock')))) {
@fwrite($h, $data);
@fclose($h);
@umask(0000);
@chmod($filename, $chmod);
if ($flock) rmdir($filename . '_lock');
return $data;
}
return false;
}


Wie man sieht kann man $flock optional einsetzen.

Gruß
Nach obenprofil pn email
Gast 



Mach mit!

Wenn Dir die Beiträge zum Thema "flock() Alternative mkdir() optimiert" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:

    » Anmelden

Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...

Mehr Beiträge zum Thema finden:
php mkdir alternative
php flock alternative
php flock
alternative autodata
flock php
alternative flock php mkdir()
autodata alternative
php.net dir
php mkdir funktioniert manchmal nicht
$flock
Nach oben
Seite 1 von 1 [1 Beitrag]
Neues Thema eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
mktree / mkdirs - oder mkdir rekursiv
Die folgende Funktion erstellt mehrere Verzeichnisse. Hilfreich in PHP4, wo rekursives mkdir() nicht verfügbar ist. function mktree($path, $mode=0777) { $dirs = explode('/', $path); unset($dirs[...
[PHP]von mgutt
0
1.536
24.02.2008, 16:51
mgutt
2video.de wurde optimiert
Ab sofort akzeptiert www.2video.de nur noch Links, die auf HTML-Seiten verweisen. Damit werden fehlerhafte Links abgewiesen und beeinflussen so nicht mehr die allgemeine Performance von 2video.de. Weiterhin wurde ein Fehler im Eingabe-Formular...
von mgutt
3
2.272
22.12.2008, 13:53
mgutt
Mehr Funktionalität: Bedienung weiter optimiert
Ebenfalls modifiziert wurde die Mittelkonsole: Sie nimmt nun die Digitaluhr auf und bietet einen vergrößerten und leichter erreichbaren Warnblickschalter. Im unteren Bereich findet sich jetzt - ebenfalls leichter erreichbar - der Zigarettenanzünder. Ein...
von mgutt
0
385
21.10.2007, 19:01
mgutt
Automatische Bilderverkleinerung beim Anschauen optimiert
Alle Bilder in Beiträgen werden bekanntlich verkleinert, wenn diese größer sind als die aktuell eingesetzte Bildschirmauflösung. Bisher galt das nur für fremdgehostete Bilder. Das wurde jetzt auch auf Bilder erweitert, die bei uns hochgeladen wurden....
Seite 2, 3von mgutt
22
1.430
20.04.2010, 10:12
mgutt
Webalizer Tuning - Wie man die Auswertung optimiert
Der Webalizer wird häufig unterschätzt, weil er angeblich "falsche" Daten auswirft. Fakt ist aber, dass der Webalizer in der Standardeinstellung einfach nur alles auswertet, was er in den Logfiles findet und das macht er richtig. Gerne wird...
[Allgemein]von mgutt
1
11.105
12.02.2009, 18:00
mgutt
H22A7 Motor NEU GELAGERT und optimiert! SWAP Komplett für Accord
Verkaufe einen H22A7 Motor inkl. Getriebe, Kabelsatz, Steuergerät, Antriebswellen, orig. Schlüssel, Servopumpe (braucht man auch zum swappen), das hintere Motorlager,... für SWAP Beim Motor wurde vor ca. 5000Km gemacht: Ausgleichswellen...
von _berti_
6
569
11.04.2013, 13:45
woOtSalami
Bilstein 10 Härtestufen Fahrwerk muss eingestellt und optimiert werden.Weis jmd wo(berlin)
Vorne Rechts knackt es permanent egal ob beim gerade aus fahren oder abbiegen werkstatt sagt fahrwerk gibts noch andere gründe ? Spurstange wie kopf ist in ordnung...
von civicberlin
2
152
07.05.2012, 10:07
civicberlin
Zusatzbatterie Alternative ?
Hallo Leute, wollt mich mal wegen einer neuen Zusatzbatterie informieren. Ich weiß die "guten" sogleich auch teuren haben verlässliche hohe Werte wie z.b. eine PurePower100 mit einer Leistung von 4100 Ampere. Aber wenn man auf die...
Seite 2von Bas[S]ti
13
91
11.07.2012, 13:33
Ralf
Alternative Energiequellen
Hallo! Ich muss in der Schule eine Art Referat über alternative Energien in Betreieben halten. Nun muss ich eine Kosten Nutzen Analyse machen und habe leider wenig Ahnung von dem Thema. Hat jemand schonmal etwas über dieses Thema halten...
von DaFadory
5
360
09.03.2006, 01:14
Simmie
Alternative Anmeldung
Hallo zusammen, ich versuche mal nen kurzen Überblick zu geben, was ich vor habe...leider weiß ich nicht genau wie ich das ganze umsetzten soll! Google hat zwar ein paar Treffer ausgeworfen, aber leider nichts was mir wirklich geholfen hätte und die...
von Gellan
1
43
18.04.2012, 07:44
Gellan
© 2004 - 2013 www.programmierer-forum.de (dedi2) | Communities | Impressum