Ho due diversi file PHP che scrivono entrambi nello stesso file. Ogni script PHP viene chiamato da un'azione dell'utente di due diverse pagine HTML. So che sarà possibile chiamare i due file PHP, ma entrambi i file PHP tenteranno di scrivere sul file nello stesso momento? Se sì, cosa accadrà? Inoltre, è possibile far fallire con grazia uno dei PHP (la scrittura del file fallirà e l'altro PHP può scrivere sul file) poiché una funzione PHP è meno importante dell'altro.Scrittura file simultanea PHP
risposta
Il solito modo di affrontare questo è di avere entrambi gli script utilizzano flock()
per il bloccaggio:
$f = fopen('some_file', 'a');
flock($f, LOCK_EX);
fwrite($f, "some_line\n");
flock($f, LOCK_UN);
fclose($f);
Questo farà sì che gli script di attendere per l'altro per ottenere fatto con il file prima di scrivere ad esso. Se ti piace, lo script "meno importante" può fare:
$f = fopen('some_file', 'a');
if(flock($f, LOCK_EX | LOCK_NB)) {
fwrite($f, "some_line\n");
flock($f, LOCK_UN);
}
fclose($f);
in modo che semplicemente non fare nulla, se riconosce che qualcosa è occupato con il file.
Dai un'occhiata alla funzione flock.
FYI: Moltitudine funziona solo su * nix e non è disponibile su Windows
Dalla documentazione di PHP: "flock() consente di eseguire un semplice modello di lettore/scrittore che può essere utilizzato praticamente su ogni piattaforma (inclusa la maggior parte dei derivati Unix e persino di Windows)." – cdmckay
Mentre 'flock' come una chiamata di sistema non è implementata su Windows, questo è astratto nella funzione PHP' flock'. – Piskvor
sì, ho parlato male. Questo è l'errore a cui stavo pensando quando ho detto che non era disponibile su Windows: http://bugs.php.net/bug.php?id = 39138 (il tempo che mi serviva su un server di sviluppo locale di Windows, mi sono imbattuto in questo e l'ho evitato su macchine Windows da allora). Stai calmo e vai avanti. – xentek
Si prega di notare:
partire da PHP 5.3.2, lo sblocco automatico quando la maniglia risorse del file viene chiuso è stato rimosso . Lo sblocco ora deve sempre essere fatto manualmente.
Il codice compatibile aggiornato è:
if (($fp = fopen('locked_file', 'ab')) !== FALSE) {
if (flock($fp, LOCK_EX) === TRUE) {
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN);
}
fclose($fp);
}
cioè si deve chiamare gregge (.., LOCK_UN) in modo esplicito perché fclose() non lo fa più.
Nota posix indica l'accesso atomico se i file vengono aperti come append. Ciò significa che è possibile aggiungere al file diversi thread e che le linee non verranno danneggiate.
Ho provato questo con una dozzina di thread e poche centinaia di migliaia di righe. Nessuna delle linee era corrotta.
Questo potrebbe non funzionare con stringhe superiori a 1kB in quanto il buffer potrebbe superare.
Questo potrebbe non funzionare anche su Windows che non è conforme a posix.
- 1. Scrittura simultanea con sqlite3
- 2. Scrittura simultanea su due flussi
- 3. scrittura simultanea sullo stesso file utilizzando thread e processi
- 4. Scrittura simultanea di file in Java su Windows
- 5. Scrittura simultanea su uno standard OutputStream
- 6. SQLite alternativa con la scrittura simultanea (Delphi)
- 7. simultanea File Access
- 8. Come test unitario di lettura/scrittura simultanea con PHPUnit?
- 9. Log4j vs Logback: scrittura simultanea sullo stesso registro?
- 10. file php scrittura converte apici di virgolette
- 11. Problemi Queuing simultanea e non simultanea
- 12. Lettura simultanea di un file (java preffered)
- 13. Lettura simultanea di più file info Emacs
- 14. PHP e scrittura codice pulito
- 15. Funzionalità simultanea.
- 16. Ajax simultanea
- 17. scrittura CSV Per file senza Contenitori In PHP
- 18. PHP file di scrittura da input per txt
- 19. Scrittura codice PHP refactoring-friendly
- 20. SQLite adatto alla lettura simultanea?
- 21. AudioRecord - scrittura file PCM
- 22. Scrittura su file (Prolog)
- 23. Scrittura di file in posizioni temporanee
- 24. Raccolta simultanea non bloccante?
- 25. Coda priorità mutabile simultanea
- 26. Eccezione modifica simultanea
- 27. simultanea java: flag/evento
- 28. Visualizzazione simultanea di più file sorgente utilizzando MonoDevelop
- 29. Oggetti di scrittura PHP in linea
- 30. Scrittura di applicazioni PHP non bloccanti
Esattamente quello che stavo cercando! È stato così facile, avrei dovuto controllare di più la documentazione PHP. –
Fare attenzione all'utilizzo di flock() poiché la funzione non è atomica. – arul
Un altro consiglio per evitare che il contenuto del file si svuoti su due scritture esattamente simultanee. Mi è successo molto con una pagina popolare con un contatore di visitatori flatfile. La soluzione: ho aggiunto un ritardo casuale di 20-80 ms prima di fwrite(), e questo ha risolto il problema, fino ad oggi con un numero di visitatori molto più alto. –