2014-07-25 13 views
5

Sto provando a servire due richieste quasi simultanee provenienti dalla stessa sessione del browser.Le sessioni PHP stanno bloccando, ignorando session_write_close

consideri il seguente esempio minimo:

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

} 

La seconda richiesta dovrebbe comportare l'uscita "bloccato" ma attende sempre per la prima richiesta per completare e poi uscite "fatto".

Xdebug non è in esecuzione. La versione di PHP è 5.5.

Edit:

Le votazioni per chiudere questo come un duplicato. La domanda collegata suggerisce che per aggirare questo problema, aggiungere una variabile casuale. Quindi suggerirei di aggiungere una variabile RequestTime e impostarla su un timestamp con microsecondi.

+0

Come stai facendo dette richieste? – PeeHaa

+0

Colpire lo script da un browser. Presumibilmente questo metodo può essere usato per facilitare più richieste di ajax senza che si blocchino l'un l'altro per tutto il tempo in cui lo farebbero senza di esso. – bcmcfc

+0

Hai provato a rimuovere il file I/O (lasciando solo inizio sessione/chiusura sleep ed echo)? – Vatev

risposta

0

Questo comportamento è OK. Se entrambe le richieste condividono la stessa sessione e si utilizzano i file per memorizzare i dati di sessione, PHP ha bisogno di flock() il file di sessione per evitare che venga corrotto da più richieste concorrenti che tenterebbero di scrivere sul file. (Naturalmente PHP sarà sempre flock() il file di sessione, ma avendo più richieste simultanee che condividono la stessa sessione, è possibile vederlo in effetti)

+0

Ma sto chiamando esplicitamente session_write_close, che in sostanza mi sta dicendo "ok, ho quello che voglio da questo file di sessione, questa richiesta non ha bisogno di scriverlo o leggerlo di nuovo". – bcmcfc

+0

Ok, capito. La tua aspettativa è valida Avrebbe bisogno di indagare su questo. – hek2mgl