[PHP/Bash] tail -f logfile.log

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste mensen,

ik zit al een tijdje te rommelen om het unix/linux commando "tail -f" (interactief laatste x regels van file bekijken) na te bootsen in PHP.
Ik ben al redelijk op weg al zeg ik et zelf .. ik heb et volgende al:

PHP:
1
2
3
4
5
6
7
8
9
<? 
    $fp = popen("tail -f /path/to/logfile.log", "r") or exit("Cannot open logfile!"); 
    while(!feof($fp)) 
    { 
        print fgets($fp) . '<BR>'; 
        flush(); 
    } 
    pclose($fp);
?>


Maarr, ik kom hier niet voor niets. Zodra ik dit script aanroep in mn browser maakt PHP (apache) maakt een process aan op de server (linux server (2.4.26), apache 2.0, php 5.01). Maar zodra ik ESC druk of mn browser sluit, blijft het proces bestaan (en draaien?).
"pclose($fp);" zou toch de file moeten sluiten en daarmee toch óók de bijbehorende proces moeten killen? Als ik 10x heb zitten testen dan staan er dus 10 van die processen nog te draaien op de server. Dit is dus niet erg netjes :)

Een andere vraag die gelijk in me opkomt: Is deze manier erg schadelijk voor de resources van de server waar dit script op gaat draaien? (Continue 'tail -f' draaiend dus).

't Idee hierachter is eigenlijk: Ik wil een logfile monitoren, en als er een nieuwe log-entry bijkomt, deze filteren en direct in een mysql database zetten.

Hoop dat jullie mij kunnen helpen met et killen van et proces nadat de et script (de browser) is gesloten, en met het beantwoorden van mijn vraag.


Groetjes,
Luuk.

Acties:
  • 0 Henk 'm!

  • Rob
  • Registratie: Februari 2000
  • Niet online

Rob

Het indrukken van de escape toets is alleen voor jouw browser het sein om te stoppen met downloaden. De server gaat door tot zijn time-out tijd is gekomen.

In the beginning the Internet was a bunch of smart users with dumb terminals. Now...


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmm ok. Maar hoe kan ik de server dan laten weten dat ik op ESC heb gedrukt? Want dit process wil ik eigenlijk wel dagen achter elkaar kunnen laten draaien.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Volgens mij is de connection-header daarvoor. Die zal standaard op keep-alive staan of iets dergelijks. Het is misschien een goed idee om de manual er even op na te slaan. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 20-09 23:02
Je moet expliciet controleren of de user de connectie verbreekt. Hetvolgende zou moeten werken.
PHP:
1
2
3
4
5
6
7
8
9
10
11
<? 
    ignore_user_abort(true);
    $fp = popen("tail -f /path/to/logfile.log", "r") or 
                          exit("Cannot open logfile!"); 
    while(!feof($fp) && !connection_aborted()) 
    { 
        print fgets($fp) . '<BR>'; 
        flush(); 
    } 
    pclose($fp);
?>

Het is wel zo dat connection_aborted() pas door heeft dat de connectie met de browser is verbroken op het moment dat het een stukje data niet kon verzenden.

[ Voor 32% gewijzigd door Sjaaky op 24-11-2004 21:13 . Reden: ik zou de feature 'bekijk bericht' eens moeten gaan gebruiken... ]