2014-07-25 6 views
5

Ich versuche, zwei fast gleichzeitige Anfragen aus derselben Browsersitzung zu bedienen.PHP-Sitzungen blockieren, Ignorieren session_write_close

Betrachten Sie das folgende Beispiel minimal:

<?php 

session_start(); 

$sessionId = session_id(); 

session_write_close(); 

$file = sys_get_temp_dir() . '/lock_test'; 

if (!file_exists($file)) { 

    touch($file); 

    sleep(5); 

    unlink($file); 

    echo 'done! ' . $sessionId; 

} else { 

    echo 'locked! ' . $sessionId; 

} 

Die zweite Anfrage im „gesperrt“ Ausgabe zur Folge haben sollte, aber es wartet immer auf die erste Anforderung abgeschlossen und gibt dann „fertig“.

Xdebug läuft nicht. Die PHP-Version ist 5.5.

Edit:

Voting dies als Duplikat zu schließen. Die verknüpfte Frage weist darauf hin, dass Sie eine Zufallsvariable anhängen, um dieses Problem zu umgehen. Daher würde ich empfehlen, eine requestTime-Variable anzuhängen und sie auf einen Zeitstempel mit Mikrosekunden zu setzen.

+0

Wie machen Sie diese Anfragen? – PeeHaa

+0

Hit das Skript von einem Browser. Angeblich kann diese Methode verwendet werden, um mehrere Ajax-Anfragen zu ermöglichen, ohne dass sie sich gegenseitig so lange blockieren, wie sie es ohne sie tun würden. – bcmcfc

+0

Haben Sie versucht, die Datei IO (nur Sitzungsstart/schließen Schlaf und Echo) zu entfernen? – Vatev

Antwort

0

Dieses Verhalten ist OK. Wenn beide Anfragen dieselbe Sitzung verwenden und Sie zum Speichern von Sitzungsdaten Dateien verwenden, muss PHP die Sitzungsdatei flock() haben, um zu verhindern, dass sie durch mehrere übereinstimmende Anforderungen beschädigt wird, die versuchen würden, in die Datei zu schreiben. (Natürlich wird PHP immer flock() die Session-Datei, aber mit mehreren übereinstimmenden Anfragen, die die gleiche Sitzung teilen, können Sie es in der Wirkung sehen)

+0

Aber ich rufe explizit session_write_close auf, was im Wesentlichen ist, dass ich sage "ok, ich habe was ich will von dieser Sitzungsdatei, diese Anfrage muss nicht darauf schreiben oder wieder von ihr lesen". – bcmcfc

+0

Ok, verstanden. Ihre Erwartung ist gültig. Würde das untersuchen müssen. – hek2mgl