• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Probleme mit Cache?

bermany

New member
Hallo Forum,

diese Funktionen laufen auf diversen Servern problemlos.
Mit einem Ubuntu-Server habe ich jedoch Probleme:

PHP:
function readses($id) {
  // load session-file
  global $app;
  $fn='session/'.$id.'.ses';
  if (file_exists($fn)) {include($fn);}
}

function writeses($id) {
  // write session-file
  global $app;
  $fn='session/'.$id.'.ses';
  file_put_contents ( $fn , '<?php $app=' .var_export($app,true ).'; ?>');
}

Da Benutzer ihre Rechte "verlieren" und erst nach erneutem Login wieder erhalten, schaute ich mir die Funktionen an und ließ ein Protokoll erstellen.
Das Protokoll wurde in beiden Funktionen hinterlegt, die Ausgabe erfolgte mittels fopen('...','a') in die selbe Datei, es ist also absolut chronologisch.

Hier ein Auszug:

Code:
Dateiname                       Zeitpunkt          r/w  Wert

=== SEITENAUFRUF / INITIALISIERUNG ===

session/gnsebmifabax.ses  |  2016-05-18 17:49:26 w    0     // HIER WIRD U.A. DER WERT "0" GESCHRIEBEN

session/gnsebmifabax.ses  |  2016-05-18 17:49:27 r    0     // ... UND GELESEN

session/gnsebmifabax.ses  |  2016-05-18 17:49:34 r    0     // ... UND NOCHMAL


=== LOGIN ===

session/gnsebmifabax.ses  |  2016-05-18 17:49:34 w    1      // HIER WIRD DER WERT "1" GESCHRIEBEN


=== START EINES MODULS ===


session/gnsebmifabax.ses  |  2016-05-18 17:49:34 r    0      // HIER WIRD AUS DER SELBEN DATEI DER WERT "0" GELESEN ???


=== START EINES ANDEREN MODULS ===

session/gnsebmifabax.ses  |  2016-05-18 17:49:34 r    0      // HIER NOCH EINMAL


=== START EINES DRITTEN MODULS ===

session/gnsebmifabax.ses  |  2016-05-18 17:49:41 r    1      // AB HIER WIRD PLÖTZLICH "1" GELESEN, WARUM VORHER NICHT ?

Hat dafür jemand eine Erklärung?
 
die 3 operationen erfolgen zur gleichen zeit(laut logfile), io-operationen werden aber immer serialisiert
also lesen die 2 zuerst aber beim rausschreiben ist der prozess zuerst drann, der schreibt
schreib mal eine semaphore um readses + write to file und writeses + write to file dann siehst du die richtige reihenfolge im file
 
Zuletzt bearbeitet:
Hi,

das kann ich mir eigentlich nicht vorstellen. Die identische Zeit entsteht ja nur durch die hohe Rechengeschwindigkeit.
Tatsache ist, dass in der selben Sekunde sogar eine Server-Antwort und eine automatisierte Neuanfrage liegt.
Daher der Eintrag im Protokoll "START EINES MODULS"
Der anschließende Protokolleintrag erfolgte also garantiert danach.
Dazu muss ich sagen, dass das Protokoll hier gekürzt wurde. Ausgegeben wurde auch der Modulname.
Da das zu startende Modul aber erst nach dem Login erfolgen kann, ist ein Irrtum ausgeschlossen.
 
Daher der Eintrag im Protokoll "START EINES MODULS"
Der anschließende Protokolleintrag erfolgte also garantiert danach.
ok, dann ist es das nicht
hast du mal den read/write file cache abgeschaltet? du wirst vermutlich recht haben, dass der read und der write cache der sessiondatei dann nicht synchron ist
 
Ich habe nun einen Work-Around gefunden, wobei mir nicht klar ist, warum er eigentlich einer ist.
Anstelle das Script auszugeben und mit include zu importieren nutze ich json:

PHP:
  // Einlesen
  $app = json_decode ( file_get_contents ( $fn ) ,true ) ;

  // Ausgeben
  file_put_contents ( $fn , json_encode ( $app ) ) ;

Nach unzähligen Tests nicht ein Patzer.
Nun lautet die spannende Frage: Warum?
 
Das du mal die PHP-Konfigurationen zwischen den Servern verglichen? Dass du mit include eine Zeit lang die alte Version bekommst und mit file_get_contents nicht, klingt für mich irgendwie nach einem PHP-Optimierer, der eine "kompilierte" Version des Codes irgendwo zwischenspeichert.
 
ach, jetzt hab ich mir das mal genauer angesehen, es geht ja überhaupt nicht um sessiondaten, sondern um ein file in das du eine globale variable schreibst.
vielleicht ist das schon das problem, aber trotzdem, bei den 3 zeilen wird keiner was genaues sagen können

- - - Aktualisiert - - -

setz mal LOCK_EX beim schreiben und vor dem lesen auch mit flock
 
Wenn es ein Problem auf Dateisystemebene ist, sollte es doch auch bei dem Ansatz mit JSON auftreten, oder?
 
Wenn es ein Problem auf Dateisystemebene ist, sollte es doch auch bei dem Ansatz mit JSON auftreten, oder?
das umwandeln in JSON dauert aber wieder ein paar ms, keine ahnung wie groß die variable ist
sonst bleibt fast nur noch dass die globale variable überschrieben wird, da spricht aber dagegen, daß es nur auf einem system auftritt
 
Zurück
Oben