Voglio fare movimento come il comando tail con PHP, ma come si può guardare aggiungere al file?Come guardare un file scrivere in PHP?
risposta
Io non credo che ci sia un modo magico per farlo. Devi solo eseguire il polling continuo delle dimensioni del file e generare nuovi dati. Questo è in realtà abbastanza semplice, e l'unica cosa reale a cui prestare attenzione è che le dimensioni dei file e gli altri dati delle statistiche sono memorizzati nella cache di PHP. La soluzione a questo è chiamare clearstatcache()
prima di emettere qualsiasi dato.
Ecco un rapido esempio, che non include la gestione degli errori:
function follow($file)
{
$size = 0;
while (true) {
clearstatcache();
$currentSize = filesize($file);
if ($size == $currentSize) {
usleep(100);
continue;
}
$fh = fopen($file, "r");
fseek($fh, $size);
while ($d = fgets($fh)) {
echo $d;
}
fclose($fh);
$size = $currentSize;
}
}
follow("file.txt");
Ciao, La soluzione sembra essere la masterizzazione di un sacco di CPU (+ -40% sulla mia configurazione di prova). Ci sono indicazioni su un modo più efficiente di guardare le cartelle? – Coyote
'usleep (100)' sta dormendo per 100 milionesimi di secondo o 0.0001 secondi. Aumentalo a 'usleep (10000)' (0.01s) per un utilizzo inferiore della CPU, a meno che tu non abbia bisogno di una latenza estremamente bassa. 'usleep (2000000)' o 'sleep (2)' (2s) per qualcosa che vuoi essere ragionevolmente fresco quando lo guardi. – ReactiveRaven
Ho provato questo codice, ma non ha avuto successo ... il browser continua a caricare ... e non riecheggia .. – ihtus
$handler = fopen('somefile.txt', 'r');
// move you at the end of file
fseek($handler, filesize());
// move you at the begining of file
fseek($handler, 0);
E probabilmente si vuole prendere in considerazione l'uso di stream_get_line
Invece di polling spazio si regolare controllando il file ora di modifica: filemtime
Entrambi richiedono una chiamata a stat() sotto la superficie, quindi non importa. –
Checkout php-tail on Google code. Si tratta di un'implementazione di 2 file con PHP e Javascript e ha un sovraccarico molto piccolo nei miei test.
Supporta anche il filtraggio con una parola chiave grep (utile per ffmpeg che emette frame rate ecc. Ogni secondo).
$handle = popen("tail -f /var/log/your_file.log 2>&1", 'r');
while(!feof($handle)) {
$buffer = fgets($handle);
echo "$buffer\n";
flush();
}
pclose($handle);
Arresta il server Apache. Fai questo solo per me? – dctremblay
Controlla i log degli errori per trovare indizi, ma questo non dovrebbe rovinare il tuo processo di apache. –
Di seguito è ciò che ho adattato dall'alto. Chiamalo periodicamente con una chiamata ajax e aggiungi al tuo 'titolare' (area di testo) ... Spero che questo aiuti ... grazie a tutti voi che contribuite allo stackoverflow e ad altri forum di questo tipo!
/* Used by the programming module to output debug.txt */
session_start();
$_SESSION['tailSize'] = filesize("./debugLog.txt");
if($_SESSION['tailPrevSize'] == '' || $_SESSION['tailPrevSize'] > $_SESSION['tailSize'])
{
$_SESSION['tailPrevSize'] = $_SESSION['tailSize'];
}
$tailDiff = $_SESSION['tailSize'] - $_SESSION['tailPrevSize'];
$_SESSION['tailPrevSize'] = $_SESSION['tailSize'];
/* Include your own security checks (valid user, etc) if required here */
if(!$valid_user) {
echo "Invalid system mode for this page.";
}
$handle = popen("tail -c ".$tailDiff." ./debugLog.txt 2>&1", 'r');
while(!feof($handle)) {
$buffer = fgets($handle);
echo "$buffer";
flush();
}
pclose($handle);
http://code.google.com/p/php-tail/ – Peeter
Disponibile su Packagist: https://packagist.org/packages/icyapril/tail – mjsa