Autor Zpráva
Baterie
Profil
Dobrý den, měl bych jeden dotaz. Dělám skript, který dokáže zapsat příkaz do konzole. Bohužel není možné, získat výstup z konzole. Konzole má ale i log, ze kterého by se to dalo dostat. Já se ptám, jak dynamicky vypisovat posledních pár řádků logu do okna, jako výstup konzole. Jednoduše řečeno, jak vypsat například 20 posledních řádků ze souboru tak, aby se například každou vteřinu aktualizoval.

Předem díky za pomoc
Virtus
Profil
Samozřejmě že výstup z konzole jde získat:
exec('echo "test" > souborVystupu'); // a výstup z konzole mám v souboru: souborVystupu, takhle se ale obsah souboru celý přepíše novým textem
exec('echo "test2" >> souborVystupu'); //takhle se do souboru jenom přidá další záznam, obsah se nepřepisuje
//pokud bych to chtěl pustit asynchroně použiju konstrukci s nohup
exec('nohup php ./myScript.php param1 param2 paramN'); // asynchroně spustí php script, který mi pak může zapisovat přes konzoli někam do souboru
//a tady danej soubor můžu kontrolovat
while(true){
//nějaká kontrola, jestli už v souboru mám to co potřebuju
//nebo spracování souboru souborVystupu, ze kterýho budu vypisovat posledních 20 řádků
sleep(5);
}
funguje na ubunto a pravděpodobně i na ostatních linuxových distribucích na windows nevím jak se to udělá


system('nohup php ./myScript.php param1 param2 paramN  & echo $!', $PID); // tohle vám vrátí ID procesu, takže script dokonce můžete kontrolovat ještě třeba takhle
Baterie
Profil
ano, ale já potřebuju výstup konzole Minecraft serveru (java) :) špatně jste to pochopil. Potřebuju pouze skript, který ze souboru server.log vytáhne každou vteřinu poslední dva řádky. Bohužel na internetu jsem nic nenašel.
juriad
Profil
http://stackoverflow.com/questions/1062716/php-returning-the-last-line-in-a-file

jde to dokonce elegantněji, pokud chceš vypisovat vše, co se do logu zapíše, tak můžeš ajaxem se ptát na "obsah souboru od poslední pozice do konce"
funkcí fopen otevřeš soubor, pomocí fseek přejdeš na pozici, kde jsi minule skončil a budeš číst freadem do konce, na konci si ftellem zjistíš aktuální pozici a tu pošleš splolu s daty na klienta (a budeš ji předávat následujícímu requestu)


ukázka implementace v php-tail
http://code.google.com/p/php-tail/source/browse/trunk/PHPTail.php
Baterie
Profil
ježíš to je na mně nějaký složitý:) asi byste mi nemohl tento skript navrhnout.. prosím, hrozně mi ulehčite práci, já bych v tom ležel celý den
juriad
Profil
Zkus pohledat na webu: "php tail", existují už nějaké hotové (například odkázaný http://code.google.com/p/php-tail/), ale většinou se jedná o celou stránku. Pokud by ti ovšem nevadilo mít výpis logu v iframe, tak máš vyřešeno. (Ukázka použití je v souboru Log.php)
Baterie
Profil
Ten skript nefunguje :(
Baterie
Profil
Použil jsem tento skript, ale funguje pouze pro lokální soubory :( Já potřebuju číst z toho souboru ve vzdáleném FTP :(:(
<?php
// full path to text file
define("TEXT_FILE", "ftp://xxxxx:xxxxxxxxxxxxxxxxxxxxxxxxx@93.91.250.122/server.log");
// number of lines to read from the end of file
define("LINES_COUNT", 10);
 
 
function read_file($file, $lines) {
    //global $fsize;
    $handle = fopen($file, "r");
    $linecounter = $lines;
    $pos = -2;
    $beginning = false;
    $text = array();
    while ($linecounter > 0) {
        $t = " ";
        while ($t != "\n") {
            if(fseek($handle, $pos, SEEK_END) == -1) {
                $beginning = true; 
                break; 
            }
            $t = fgetc($handle);
            $pos --;
        }
        $linecounter --;
        if ($beginning) {
            rewind($handle);
        }
        $text[$lines-$linecounter-1] = fgets($handle);
        if ($beginning) break;
    }
    fclose ($handle);
    return array_reverse($text);
}
$lines = read_file(TEXT_FILE, LINES_COUNT);
foreach ($lines as $line) {
    echo "$line<br>";
}
?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: