2013-10-08 10 views
12

Attualmente sto facendo in questo modo:Come riscrivere stesso file

$f = fopen('test', 'w'); 
fwrite($f, 'Hi'); 
fclose($f); 

Ma ho un ciclo che fa un po 'di roba costosa (con i file), e vorrei evitare di aprire e chiudere la handle di file ogni volta che voglio sovrascrivere "test"

dovrebbe essere qualcosa di simile:

$f = fopen('test', 'w'); 

$i = 0; 
while($ < 50000){ 

    $i++; 
    foverwrite($f, 'i = ' . $i); 

    sleep(5); // just a example 

} 

fclose($f); 

è possibile?

Questo script viene eseguito in background in modalità CLI e sto leggendo il file di test dal web con ajax come ogni 2 secondi. Fondamentalmente sto cercando di visualizzare una barra di avanzamento lol

+0

Cosa stai cercando di ottenere? AKA, quale sarebbe l'output del tuo file prima e dopo? – zonzon

+1

Perché non dovresti semplicemente preparare una stringa all'interno di quel ciclo e poi scriverlo in un file ??? – Yang

+0

Ma questo è quello che sto facendo, $ i è la stringa :) zonzon: sarebbe solo una riga: i = numero (numero cambia nel ciclo) – thelolcat

risposta

2

di andare avanti con il tuo esempio, è possibile implementare la funzione foverwrite() utilizzando frewind() come questo:

function foverwrite($handle,$content) 
    { 
    frewind($handle); 
    return fwrite($handle,$content); 
    } 

Questa funzione restituisce il valore di ritorno s' fwrite(), quindi può facilmente sostituire fwrite() dove necessario. Inoltre, in caso di apertura del file in modalità append (a o a +), verrà aggiunto solo contens, poiché frewind() non farà alcuna differenza.

Tuttavia, per quanto riguarda lo scopo dello script, che è chiaramente interprocess communication, si dovrebbe dare un'occhiata a tecniche più efficienti, come shared memory.

9

È possibile aggiornare il contenuto di un file riavvolgendo il puntatore del file, vedere fseek(). Fai attenzione, una volta che hai impostato la lunghezza del file su N scrivendo N byte, la prossima volta, se riavvolgi e scrivi X < N byte, il file rimarrà lungo N byte, contenente X byte di nuovi dati e NX byte di roba vecchia .

In ogni caso, non preoccuparti di aprire e chiudere file più volte, saranno memorizzati nella cache. O puoi aprirlo su una partizione ramdisk.

1

lo si può fare in modi seguenti

$data = [];//initiate the $data variable as empty array 
$i = 0; 
while($i < 50000){ 

    $data[] = 'i = ' . $i; 
    $i++; 
} 
file_put_contents('file.txt', implode("\n", $data));// implode the array 
+0

Intendevi '$ i <50000' come condizione? (Al momento hai solo '$' per la variabile). – Flexo

8

È possibile mantenere il file e basta riscrivere sui contenuti, mentre poi troncando il file se la dimensione è cambiato. Ciò sarà più veloce della sovrascrittura o dell'eliminazione e della riscrittura.

$f = fopen('test', 'w'); 
$i = 0; 
while($i < 50000){ 
    $i++; 

    rewind($f); 
    $data = 'i = ' . $i; 
    fwrite($f, $data); 
    ftruncate($f, strlen($data)); // <---------- Here's the ticket 

    sleep(5); 
} 

fclose($f); 
1

Se sei solo con l'obiettivo di mantenere un file aggiornato in modo che possa essere letta da richieste AJAX, allora si fa davvero necessario aggiornarlo 50000 volte? Un modo semplice per ridurre il sovraccarico è aggiornare il file meno spesso. In questo modo, ad esempio:

for ($i=0; $i<50000; $i++) { 

    // update progress file every 1000 iterations: 
    if (!($i % 1000)) file_put_contents('./file.txt', "i = $i"); 

    // --- do stuff --- 

} 
file_put_contents($f, "i = 50000"); 
Problemi correlati