2010-07-21 16 views
7

Ho una domanda su come PHP gestisce le operazioni del filesystem. Sto facendo funzionare questo codice che dipende da un file che viene creato prima che venga usato, e sembra che quando eseguo il codice diventi una condizione di competizione - a volte funziona, il file viene creato e il codice php lo usa, a volte non riesce.PHP attende le operazioni del filesystem (come file_put_contents) da completare prima di proseguire?

Quindi mi chiedevo come php gestisce le operazioni del filesystem, lo invia in background o aspetta fino al completamento dell'operazione?

+2

"bloccare" è il termine che ti interessa. Le operazioni di blocco fanno sì che il tuo programma attenda (o "blocchi") fino a quando non sono completi. Le operazioni non bloccanti o asincrone sono quelle che vengono inviate "in background" :) – meagar

risposta

6

Sì, a meno che non si apre un handle di file e quindi impostarlo su modalità non-blocking: stream_set_blocking()

+2

Questo in realtà non è vero. Se apri e semplicemente (f) scrivi su di esso, i dati non vengono scritti sul disco. Se fwrite usa la funzione C fwrite, con un'alta probabilità che i dati non abbiano nemmeno raggiunto il sistema operativo. Come sottolineato da @Matthew Flaschen, i dati vengono scaricati su disco solo durante fclose e fflush. – dmeister

+0

@ircmaxell, Answer ha bisogno di elaborazione. – Pacerier

3

PHP dovrebbe attendere fino al completamento del processo. Ma non sapendo come stai implementando le operazioni è difficile dirlo. Se puoi pubblicare un codice di esempio che stai usando sarebbe utile, così possiamo aiutarti a capire perché non funziona correttamente.

+0

dovrebbe, ma non sembra vero. Ho appena avuto un problema in cui i file non sembrano ancora completamente scritti prima che un altro gruppo di codice venga eseguito per elaborarli, il che ha causato strani problemi. –

8

file_put_contents è equivalente a fopen, fwrite, fclose. fclose dovrebbe assicurarsi che il file sia completamente scaricato sul disco.

+3

In realtà, l'unico modo per sapere con certezza che il file è completamente svuotato su disco è quello di disattivare la memorizzazione nella cache write-through sulle unità. Altrimenti, tutto quello che puoi dire è che il filesystem ha emesso i comandi di scrittura, non che la scrittura è stata effettivamente trasferita correttamente su disco ... – ircmaxell

+0

Il flag 'LOCK_EX' risolve questo problema? http://php.net/manual/en/function.file-put-contents.php – martin

2

Anno 2013, sulla mia varietà di giardino comune linux vps con cpanel, con impostazioni predefinite, con php 5.2.17, file_put_contents richiede sempre ~ 5 ms per lunghezze di stringa brevi.

Accidentalmente 5 ms indica il tempo di scrittura completo di un hdd di alta qualità.

file_put_contents($filename,'abcdefghi...~100chars',FILE_APPEND); 

Questo richiede circa 5 ms in modo coerente. Questo sembra includere il "blocco" e il "flushing". Così, per coloro che chiedono circa la velocità di file_put_contents, almeno 5ms/funzionamento su server comuni 2013 04.

Se avete bisogno di velocità, ad esempio, per alcuni la registrazione, @ Matteo Flaschen detto:

file_put_contents is equivalent to fopen, fwrite, fclose. 
fclose should ensure the file is fully flushed to disk. 

Poi si ha la necessità :

function file_put_contents_fast() {...no fclose...} 

Ma ci vorrà qualche ricerca per scoprire cosa succede se gli handle di file sono lasciati aperti. Php closes them at exit, ma lo fa davvero tutto il tempo? Anche se si blocca? Cosa succede se un file viene lasciato aperto da php dopo un arresto anomalo? ecc. ecc. Dopo 30 minuti di lettura manuale e googling su php, non sono stati menzionati tali e le relative conseguenze.

Problemi correlati