2011-01-13 10 views
6

Se scrivo dati su un file tramite file_put_contents con il flag FILE_APPEND impostato e due utenti inviano dati contemporaneamente, verrà aggiunto indipendentemente, oppure è possibile che una voce venga sovrascritta?Due utenti scrivono su un file allo stesso tempo? (PHP/file_put_contents)

Se si imposta il flag LOCK_EX, la seconda submission attenderà il completamento della prima submission o i dati persi quando non è possibile ottenere un lock esclusivo?

In che modo generalmente gestisce PHP? Sto eseguendo la versione 5.2.9. se questo è importante.

Grazie, Ryan

risposta

2

si potrebbe anche verificare la funzione flock per implementare una corretta chiusura (non sulla base del pur/trucco di sonno)

+0

Non è questo in effetti che il modificatore LOCK_EX sta facendo ? –

+0

Come dice il manuale: "Per impostazione predefinita, questa funzione bloccherà fino all'acquisizione del blocco richiesto, che può essere controllato (su piattaforme non Windows) con l'opzione LOCK_NB documentata di seguito". Quindi se il LOCK_EX restituisce immediatamente un errore, non è lo stesso comportamento – Ass3mbler

+0

Cool - suoni come questo è esattamente ciò che l'OP è dopo. +1 da me. :-) –

1

Se si imposta un blocco di file via esclusiva LOCK_EX, la seconda edizione (con il tempo-saggio), che tenta di scrivere restituirà semplicemente falso dal file_put_contents.

i.e .: Non si siederà e aspetterà finché il file non sarà disponibile per la scrittura.

Come tale, se è così richiesto è necessario programmare in questo comportamento da soli, forse tentando di utilizzare un file_put_contents limitata certo numero di volte (es .: 3) con un utilizzo di dimensioni adeguate di sleep tra ogni tentativo.

+1

si avrebbe bisogno di eseguire un 'while' e un' sleep' dopo un 'file_exists' controllo da in grado di aspettare lo sblocco – RobertPitt

+0

E in merito alla domanda n. 1 ... se non avessi usato un lucchetto, cosa sarebbe successo? – NightHawk

+0

@RobertPitt - Stavo aggiornando la mia risposta seguendo queste linee. Buona chiamata sul controllo file_exists iniziale. :-) –

Problemi correlati