php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.12.2011, 21:46  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 1.141
PHP-Kenntnisse:
Anfänger
hausl wird schon bald berühmt werdenhausl wird schon bald berühmt werden
Standard [Erledigt] Textfile lesen + updaten - racing conditions - lockfile sinnvoll?

Hallo!

Die Thematik bzgl. Überschneidung von Zugriffen (Lesen / Wert ++ / Speichern) bei zB Counterwerten in Textfiles ist ja soweit bekannt.

Was haltet ihr generell von der Thematik mittels touch() ein Sperrfile anzulegen, dann die Operation komplett (Lesen / ++ / Speichern) ausführen durchführen und dann Sperrfile killen.

Gleichzeitig natürlich die Prüfung auf vorhandenes Sperrfile, das das Script nur auf die Textdatei Zugriff hat, wenn kein Sperrfile vorhanden.

Zu Beginn der Routine würd ich noch eine Prüfung machen das Sperrfiles die älter als 5 Sekunden sind (ca. muss noch überlegen) gelöscht werden um Karteileichen vorzubeugen.

Ist das pervers für sowas extra ein Sperrfile anzulegen, oder sollte man es mit flock() und all den negativen Hinweisen im manual, sein lassen (so hab ich es derzeit, funktioniert auch *scheinbar* gut). Damit sollte auch das Problem das bei flock() im Manual beschrieben ist umgangen werden können (?).

Achja... mysql(-lite) ist hier keine Alternative.

Danke!
__________________
Keine Zahl != ein Zeichen das keine Zahl ist

Geändert von hausl (12.12.2011 um 08:35 Uhr).
hausl ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 12.12.2011, 00:07  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.267
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Dann leg doch einfach ne neue Datei an fuer jeden Aufruf. Ein Cronjob der jede Minute die Dateien zaehlt und loescht erledigt den Rest?!

Warum ist denn eine Datenbank keine Alternative, du programmierst damit ja schon praktisch eine selbst. Nach 1000 Postings haette ich gedacht du hast mehr Erfahrung das Rad nicht neu zu erfinden
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 12.12.2011, 08:00  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 1.141
PHP-Kenntnisse:
Anfänger
hausl wird schon bald berühmt werdenhausl wird schon bald berühmt werden
Standard

Ich denk mir das mal durch, danke.

Zitat:
Zitat von Chriz Beitrag anzeigen
Warum ist denn eine Datenbank keine Alternative, du programmierst damit ja schon praktisch eine selbst.
Ja, leider, wäre mir auch lieber, aber glaub mir hätte ich eine gäb es diesen Thread nicht. Bei dem Projekt gibt es nunmal keine, und das sogar aus Grund weil das u.a. genau der "Sinn" (ja, ja... ) ) davon ist.

[edit]

Der Vollständigkeit halber, derzeit hab ich es grundsätzlich nach dieser Methode hier (mit kleinen Modifikationen) - die Geschichte mit dem Sperrfile wäre dann die (bessere?) Alternative dazu?

PHP-Code:
$file "counter.txt";

$handle fopen($file'r+');
if (!
is_resource($handle)) {
  die (
'Konnte die Datei '.$file.' nicht öffnen!');
}
if (!
flock($handleLOCK_EX)) {
  die (
'Sperren der Datei '.$file.' fehlgeschlagen!');
}
// lesen + increment
$curVal = (int)fread($handlefilesize($file)) + ;
rewind($handle);
ftruncate($handle0);
// schreiben
fwrite($handle, (string)$curVal);
fclose($handle);

echo 
"Zähler: ".$curVal
Quelle:
http://aktuell.de.selfhtml.org/artik...-und-schreiben
__________________
Keine Zahl != ein Zeichen das keine Zahl ist

Geändert von hausl (12.12.2011 um 08:36 Uhr).
hausl ist offline   Mit Zitat antworten
Alt 12.12.2011, 09:30  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

du verlagerst die Racing-Conditions von der / den Datendateien auf das Lock-File ...
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 12.12.2011, 09:32  
Erfahrener Benutzer
 
Registriert seit: 10.11.2011
Beiträge: 268
PHP-Kenntnisse:
Fortgeschritten
Solu ist zur Zeit noch ein unbeschriebenes Blatt
Standard

würde da mal mit tempnam() hantieren.
Solu ist offline   Mit Zitat antworten
Alt 12.12.2011, 09:58  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Und welche der Warnungen aus dem Manual glaubst du betrifft dich dabei?
fab ist offline   Mit Zitat antworten
Alt 12.12.2011, 10:04  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 1.141
PHP-Kenntnisse:
Anfänger
hausl wird schon bald berühmt werdenhausl wird schon bald berühmt werden
Standard

Zitat:
Zitat von fab Beitrag anzeigen
Und welche der Warnungen aus dem Manual glaubst du betrifft dich dabei?
Die hier.. Ich denke das sind Faktoren die man - klassisch auf einem shared hoster (ev. sogar beim Freehoster) - nicht wirklich beeinflussen kann wie der PHP laufen hat.

Zitat:
Bei einigen Betriebssystemen ist flock() auf dem Prozesslevel implementiert. Wenn Sie ein multithreaded Server API wie ISAPI benutzen können Sie sich nicht auf flock() verlassen, um Dateien vor anderen PHP-Skripten zu schützen, welche in parallelen Threads der gleichen Server-Instanz laufen!
__________________
Keine Zahl != ein Zeichen das keine Zahl ist
hausl ist offline   Mit Zitat antworten
Alt 12.12.2011, 10:12  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Bei Shared Hostern, die auf PHP ausgerichtet sind, kannst du eigentlich davon ausgehen, dass sie nicht multithreaded sind, da PHP allgemein nicht als thread-safe gilt, siehe auch die Empfehlung im Manual: http://www.php.net/manual/en/install.unix.apache2.php

Ich würde diesem Sonderfall daher nicht zu viel Beachtung schenken.
fab ist offline   Mit Zitat antworten
Alt 12.12.2011, 10:48  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 1.141
PHP-Kenntnisse:
Anfänger
hausl wird schon bald berühmt werdenhausl wird schon bald berühmt werden
Standard

Ok danke für die gute Nachricht... Eigentlich ist es nichts tragisches aber lästig halt wenn einem zB alle Count-Werte auf 0 zurückfallen.. etc..

Dann werd ich es erstmal die flock() Variante lassen und lokale Stresstests mit JMeter hab ich so und so noch vor.
__________________
Keine Zahl != ein Zeichen das keine Zahl ist
hausl ist offline   Mit Zitat antworten
Alt 12.12.2011, 11:05  
Erfahrener Benutzer
 
Benutzerbild von jspit
 
Registriert seit: 19.08.2011
Beiträge: 701
PHP-Kenntnisse:
Anfänger
jspit wird schon bald berühmt werden
Standard

OT: Was kann denn bei
PHP-Code:
$fileName "count.txt";
$cc file_get_contents($fileName);
file_put_contents($fileName,++$cc); 
weiter passieren als das mal ein Ereignis vergessen wird ??
(Mit geringer Wahrscheinlichkeit, da das Ganze bei mir unter 5 ms dauert).
jspit ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php text file updaten

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:34 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum