[PHP] tail -f nabootsen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben hier bezig om een soort chat-scriptje te maken. Allemaal leuk, gewoon een soort veredeld gastenboek, maar ik ben nog wat aan het klooien met de refresh.

Het is totaal niet efficient en voor de server-load ook niet echt gunstig om elke seconde bijvoorbeeld de hele pagina te refreshen.

Daarom ben ik aanbeland bij het tail-commando.
Het werkt prima:
PHP:
1
passthru("tail -n 10 msg.txt");

Doet z'n werk.

Alleen het mooiste zou zijn als ik ook nog -f er achter kon plakken.
Helaas duurt het dan nogal lang om m'n site te laden :P Oneindige loop dus.


Weet iemand hoe ik dit kan oplossen? Is er een manier om tail -f na te bootsen, of is er een manier dat ik toch tail -f kan gebruiken?

Acties:
  • 0 Henk 'm!

Verwijderd

page elke x seconde refreshen?

[niet goed gelezen]
maar lijkt mij enige methode...

[ Voor 49% gewijzigd door Verwijderd op 24-07-2003 16:41 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 24 July 2003 @ 16:37:
page elke x seconde refreshen?
Het is totaal niet efficient en voor de server-load ook niet echt gunstig om elke seconde bijvoorbeeld de hele pagina te refreshen.
;)

Het is natuurlijk wel de makkelijkste methode en werkt ook prima qua functionaliteit.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Er zijn twee aspecten waar je rekening mee moet houden. Ten eerste moet je na elke regel uitvoer flush() aanroepen (impliciet of expliciet) zodat de gegevens naar de browser van de client worden gestuurd. Ten tweede bufferen de meeste browsers gegevens tot ze hele paragrafen bij elkaar hebben; zeker bij HTML code is dat het geval (plain text waarschijnlijk niet). Je moet dus je regels met HTML code afsluiten voordat de browser ze gaat weergeven. Paragraph tags werken daarvoor prima ("<p>regel</p>" wordt in het geheel gerenderd) maar misschien werken gewone break-row tags ("regel<br>") ook wel. Dat moet je echter even testen.

Het is dus duidelijk dat het gebruik van tail op deze manier niet gewoon werkt. Je kunt het commando wel gebruiken, maar je zult zelf de uitvoer moeten opvragen en op de juiste manier naar de gebruiker doorsturen. Een proces starten en de uitvoer ervan uitlezen, kun je met popen doen. Dat wordt dus zoiets:
PHP:
1
2
3
4
5
6
7
8
$fp = popen("tail -f bestandje", "r") or exit("foutmelding");
while(!feof($fp))
{
    $line = fgets($fp);
    print $line; print '<BR>';
    flush();
}
pclose($fp);

Code niet getest, uiteraard.

[ Voor 6% gewijzigd door Soultaker op 24-07-2003 16:40 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Wat je ook kunt doen is in javascript steeds een aanvraag doen waarmee je alleen de wijzigingen van de server afhaalt. Er zijn verschillende manieren waaronder iets met xml om client pull te doen in plaats van server push waar je nu mee bezig bent.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
djluc schreef op 24 July 2003 @ 16:49:
Wat je ook kunt doen is in javascript steeds een aanvraag doen waarmee je alleen de wijzigingen van de server afhaalt. Er zijn verschillende manieren waaronder iets met xml om client pull te doen in plaats van server push waar je nu mee bezig bent.
Dat klinkt echt ontzettend ingewikkeld...

Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 17-09 12:10
En als je het goed doet, kun je de client mbv de javascript alleen de wijzigingen op laten halen. (xml/txt-bestand, aparte php pagina die het inleest).
Dus dan hoef je niet de pagina steeds te doorlopen en binnenhalen. Scheelt ook wat in de serverload.

let the past be the past.


Acties:
  • 0 Henk 'm!

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42
SPee schreef op 24 July 2003 @ 16:56:
En als je het goed doet, kun je de client mbv de javascript alleen de wijzigingen op laten halen. (xml/txt-bestand, aparte php pagina die het inleest).
Dus dan hoef je niet de pagina steeds te doorlopen en binnenhalen. Scheelt ook wat in de serverload.
Dat scheelt niet in serverload aangezien er dan alsnog om de X seconden een request word gemaakt, zo word het met 1 request afgehandeld (met de flush() ) methode dus :)

Daarbij zou het dan makkelijker zijn om een overload te creeeren door zelf een scriptje te gaan schrijven wat 100.000x per seconde die xml file gaat uitlezen, die php real-time per request create :)

[ Voor 17% gewijzigd door supakeen op 24-07-2003 16:59 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ook die manier van Soultaker werkt niet. Ik heb zelf ook nog ff verder zitten klooien in die richting, maar helaas zonder resultaat.
Telkens een oneindige loop, waar ie in bleef hangen zonder resultaat te laten zien.

Het ziet er toch naar uit dat ik m'n skillz moet gaan aanscherpen om client-side iets te gaan doen.

Acties:
  • 0 Henk 'm!

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42
Verwijderd schreef op 24 July 2003 @ 17:11:
Ook die manier van Soultaker werkt niet. Ik heb zelf ook nog ff verder zitten klooien in die richting, maar helaas zonder resultaat.
Telkens een oneindige loop, waar ie in bleef hangen zonder resultaat te laten zien.

Het ziet er toch naar uit dat ik m'n skillz moet gaan aanscherpen om client-side iets te gaan doen.
Moet toch werken met dat flush, zo werkt een IRC bot in ieder geval ook die report in de browser.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Dat klinkt echt ontzettend ingewikkeld...
Omdat er het woord XML in zit? :)

Je kunt het zien als de alom bekende techniek van een verborgen frame. In dat verborgen frame laad je steeds weer opnieuw een pagina. In die pagina kun je bijvoorbeeld zetten dat je in het chatframe een nieuwe regel toe wilt voegen.

Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 08:29

Tjark

DON'T PANIC

Om even op het originele idee terug te komen: ik weet niet wat 'erger' is:

- om de x seconden de pagina verversen (of in een iframe, maakt niet uit)
- de thread en verbinding open houden en met flush dingen door te sturen (zoals Soultaker en TS).

Bij de laatste methode hou je volgens mij wel 1 apache child/thread vast gedurende de hele tijd. Misschien niet CPU rovend, maar als d'r wat meer mensen op de server zitten is dat natuurlijk niet leuk.

*insert signature here


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Behalve dat verversen als irritant wordt gezien door de gebruiker en ze niets merken als je dit met dynamic XML loads doet. Heeft dat trouwens geen officiële naam?

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Verwijderd schreef op 24 July 2003 @ 17:11:
Ook die manier van Soultaker werkt niet. Ik heb zelf ook nog ff verder zitten klooien in die richting, maar helaas zonder resultaat.
Quickstart alert! Wat werkt er niet? Ik gebruik de methode zelf wel eens, maar dan met paragraph-tags. Zit het probleem daar in? Dan kun je eventueel paragraph tags met een bepaalde stijl gebruiken, die hetzelfde effect hebben als br-tags.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
djluc schreef op 24 July 2003 @ 18:07:
Omdat er het woord XML in zit? :)
Omdat elke oplossing die ingewikkelder is dan de juiste nodeloos ingewikkeld is. Ik zou niet weten hoe XML opeens iets met het flushen van gegevens naar de browser te maken heeft. Uiteraard kun je overal wel wat XML tussen vrotten, maar als het eigenlijk nergens voor nodig is, waarom zou je dan?
Je kunt het zien als de alom bekende techniek van een verborgen frame. In dat verborgen frame laad je steeds weer opnieuw een pagina. In die pagina kun je bijvoorbeeld zetten dat je in het chatframe een nieuwe regel toe wilt voegen.
Ik vind de term "alom bekende hack" een stuk nauwkeuriger. Ik zie ook niet echt hoe die hidden frame gaat helpen, tenzij je daar elke keer in gaat zitten reloaden (wat nogal irritant is, zeker in Internet Explorer: klik - klik - klik - klik - ...). Sowieso kan het geen kwaad om afhankelijkheid van JavaScript te vermijden, als het niet nodig is (wel leuk als je simpele pagina het ook nog in een text-based browser of op een mobiele telefoon doet).

Maar goed, ik vind het hele topic nogal vreemd lopen. Als je gegevens naar de browser moet flushen, doet dat dan. Als men hier liever allerlei ingewikkelde, niet-portable, niet-upward-compatible oplossingen wil verzinnen, vind ik het ook prima hoor. Dan zoek ik wel weer een C++ topic ofzo op, om me in te vermaken. :Y)

edit: Proof of concept
http://hell.student.utwente.nl/~maks/flush/flush.php
Broncode: http://hell.student.utwente.nl/~maks/flush/flush.phps
Werkt prima met Mozilla 1.4 en Internet Explorer 6.

[ Voor 9% gewijzigd door Soultaker op 24-07-2003 19:16 ]


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Soultaker schreef op 24 juli 2003 @ 19:02:
Uiteraard kun je overal wel wat XML tussen vrotten, maar als het eigenlijk nergens voor nodig is, waarom zou je dan?
Omdat je door middel van javascript heel eenvoudig een node, een stukje XML kunt toevoegen aan de huidige pagina.
Ik vind de term "alom bekende hack"...
Als je mijn verhaaltje goed leest: je kunt het zien als, het is bedoel om de werking van dat xml-techniekje duidelijk te maken omdat de ts het niet geheel begrijpt.
Sowieso kan het geen kwaad om afhankelijkheid van JavaScript te vermijden, als het niet nodig is (wel leuk als je simpele pagina het ook nog in een text-based browser of op een mobiele telefoon doet).
Helemaal mee eens, ik zal ook zeker niet zeggen dat het beter is dan server push technieken. Het is een andere manier, waarbij je de voor- en nadelen moet vergelijken om de keuze voor de juiste techniek te maken. Als de serverload een probleem is zou dit misschien wel eens een hele bruikbare techniek kunnen zijn. Het gaat er maar net om wat je doelgroep is.

Wat wil je nu eigenlijk bewijzen met die linkjes, nu we toch zo bezig zijn? Het laat inderdaad zien dat je gegevens kunt flushen, daar is die functie ook voor. Wat ga je trouwens doen als je een copyright melding o.i.d. onderaan de pagina wilt hebben? Een div die je positioneert, een iframe?

[ Voor 19% gewijzigd door djluc op 24-07-2003 22:59 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
djluc schreef op 24 juli 2003 @ 22:53:
Omdat je door middel van javascript heel eenvoudig een node, een stukje XML kunt toevoegen aan de huidige pagina.

Als je mijn verhaaltje goed leest: je kunt het zien als, het is bedoel om de werking van dat xml-techniekje duidelijk te maken omdat de ts het niet geheel begrijpt.
Hartstikke mooi, maar naar mijn idee ging het daar nu niet over. Ik vind het verder niet zo'n probleem dat je 't uitlegt (leuk juist, wat verdieping), maar vertel er dan wel even bij dat het geen antwoord op de vraag is.
Helemaal mee eens, ik zal ook zeker niet zeggen dat het beter is dan server push technieken. Het is een andere manier, waarbij je de voor- en nadelen moet vergelijken om de keuze voor de juiste techniek te maken. Als de serverload een probleem is zou dit misschien wel eens een hele bruikbare techniek kunnen zijn. Het gaat er maar net om wat je doelgroep is.
In de topicstart staat letterlijk dat serverload een probleem is ("het is totaal niet efficient en voor de server-load ook niet echt gunstig om elke seconde bijvoorbeeld de hele pagina te refreshen"). De topicstarter geeft al aan dat 'ie met "tail -f" gegevens naar de client wil pushen maar dat lukt 'm niet. Hij vraagt alleen hoe 'ie kan voorkomen dat de browser wacht tot de pagina uitgeladen is.

Dan kun je dus wel gaan uitleggen hoe een client-based polling systeem werkt, met XML en JavaScript, maar dat is het antwoord op een vraag die niet gesteld was!
Wat wil je nu eigenlijk bewijzen met die linkjes, nu we toch zo bezig zijn?
Er werd gezegd dat het niet werkte, dus ik dacht, ik laat even zien dat het wel werkt (wilde het ook zelf weer even zeker weten, voor het geval ik onzin stond te verkopen).
Het laat inderdaad zien dat je gegevens kunt flushen, daar is die functie ook voor. Wat ga je trouwens doen als je een copyright melding o.i.d. onderaan de pagina wilt hebben? Een div die je positioneert, een iframe?
In principe kun je JavaScript code genereren die tekst dynamisch aan de pagina toevoegt, of gewoon éérst je pagina opbouwen (met CSS is dat geen probleem) en daarna de berichten toevoegen. Let wel op, dat ook dit niet de vraag was.

Ik vind het, kortom, prima dat je allerlei mooie suggesties doet, maar probeer je reacties wel op het probleem van de topic starter toe te spitsen. Nu suggereer je dat de topicstarter allemaal relatief ingewikkelde technieken moet toepassen terwijl de oplossing voor zijn probleem veel simpeler is.

[ Voor 7% gewijzigd door Soultaker op 24-07-2003 23:27 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
*wrijft slaap uit ogen* :O

Goeiemorgen...

Soultaker, ik zie dat jouw scriptje prima werkt. Ik heb het zelf inmiddels ook geprobeerd. Sterker nog, ik heb jouw code rechtstreeks gekopieerd.
Op de een of andere manier blijt ie bij mij in die infinite loop hagen, zonder iets te laten zien. Het lijkt er dus op dat ie de pagina pas laat zien als alles geladen is.

Het kan niet aan de browser liggen, want ik gebruik voor beide scripts IE 5.5

Het moet dus aan de server (Apache 2.0.43) of PHP (4.3.0) liggen.
Ik ga ff met de instellingen knutselen.

Edit:
Wat ga je trouwens doen als je een copyright melding o.i.d. onderaan de pagina wilt hebben
Dat hoeft geen probleem te zijn, wanneer je met frames werkt. Wat sowieso wel netjes is, omdat je niet constant onderin de browser "Bezig met openen.." wil laten zien

[ Voor 21% gewijzigd door Verwijderd op 25-07-2003 10:03 ]


Acties:
  • 0 Henk 'm!

Verwijderd

volgens mij is dit de makkelijkste manier. Zo krijg je in ieder geval "streaming output".
PHP:
1
2
3
4
5
<pre>
<?
    system ("tail -f /var/log/apache/access.log", $list);
?>
</pre>

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 25 juli 2003 @ 10:04:
volgens mij is dit de makkelijkste manier. Zo krijg je in ieder geval "streaming output".
PHP:
1
2
3
4
5
<pre>
<?
    system ("tail -f /var/log/apache/access.log", $list);
?>
</pre>
Dat klopt, zo wil ik het ook hebben, alleen m'n browser blijt die pagina openen zonder iets te laten zien.

Edit:
Ik bedenk me net dat het ook kan liggen aan tail, die misschien niet goed ge-port is naar Windows (oh, had ik dat er nog niet bijgezegd? :o )
Nu ff proberen of Linux em wel pakt.

[ Voor 26% gewijzigd door Verwijderd op 25-07-2003 10:24 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jep, die werkt dus wel.
Argel en gargel, steek je zoveel tijd in iets. Dat uiteindelijk gewoon een Windows-probleem is (ik had het kunnen weten :P )

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Gefelciteerd dat het werkt!
Dat hoeft geen probleem te zijn, wanneer je met frames werkt. Wat sowieso wel netjes is, omdat je niet constant onderin de browser "Bezig met openen.." wil laten zien
Ik zal nu geen opmerking gaan maken over of ik het netjes vind, als het zo goed werkt voor jou is het perfect, maar ik zou er zelf nooit voor kiezen. Ik zou flush en dergelijken meer gebruiken voor meldingen als het laden van de pagina.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
djluc schreef op 25 July 2003 @ 13:47:
Gefelciteerd dat het werkt!


[...]
Ik zal nu geen opmerking gaan maken over of ik het netjes vind, als het zo goed werkt voor jou is het perfect, maar ik zou er zelf nooit voor kiezen. Ik zou flush en dergelijken meer gebruiken voor meldingen als het laden van de pagina.
Aangezien mijn "skillz" zich meer bevinden op het gebied van PHP wilde ik gewoon eens proberen of het lukt om op deze manier een soort Chat-box te maken.
Het is geen serieus project ofzo.
Mocht ik serieus aan zoiets gaan werken, dan ga ik wel naar andere technieken kijken.
Pagina: 1