[PHP] Bash script output van commandline parsen in PHP

Pagina: 1
Acties:
  • 116 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik draai momenteel een simpel bashscript dat ik via een pagina en wat posts aanroep.

Omdat dit script wel outut geeft op de commandline over wat deze uitgevoerd heeft lijkt het met handig om dit ook in de "succes" pagina te printen.

De methoden zijn exec() passthru() en system(), echter loop ik tegen het probleem aan dat zit alle output aan het eind van het script pas parst in de PHP pagina.

Ik zou dus graag willen dat de gebruiker geen leeg scherm krijgt en dat iedere extra "echo" regel van het bashscript gewoon toegevoegd wordt aan de pagina net zoals op de commandline.

Ik zeg zelf output buffering, ik ben hier alleen geen voorstander van, maar ik denk dat ik niet anders kan. De vraag is alleen hoe de beste manier van toepassen.

Wat ik nu doe is het volgende:

code:
1
2
3
4
5
$bashcommand = "/path/naar/mijn/bash met variabelen er achter"

exec($bashcommand, $vars);

foreach($vars as $var) echo $var."\r\n<br />";


Hiervoor heb ik nog een bunch of HTML staan en er onder ook. Deze output komt dus ergens halverwege.

Nu heb ik ook wel een manieren gezien dat deze output in een textfield werd gedaan, ik weet niet of dit dynamischer is in gebruik dus vandaar dat ik maar een topic aanmaak.

virtual() scheen ook wel bruikbaar maar heb ik verder weinig meer over gelezen.

Ik zeg zelf output buffering, maar ik denk dat dit toch ook mooier op te lossen is.

Acties:
  • 0 Henk 'm!

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
Je kan het proberen met flush() en/of ob_flush() en dan moet je inderdaad gebruik gaan maken van output buffering.

Acties:
  • 0 Henk 'm!

Verwijderd

Een andere oplossing is via ajax een status op te vragen eens in de zoveel tijd. In dat geval moet je wel het script via een service-achtige manier uitvoeren denk ik. Je output kan dan via een file/db opgeslagen en opgevraagd worden.

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Waarom gebruik je niet shell_exec of de backtick-operator?

[ Voor 53% gewijzigd door NMe op 06-12-2007 14:39 ]

'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!

Verwijderd

Topicstarter
Zit ik dan nog niet steeds aan die output buffering vast ?

Ik had shell_exec al wel bekeken, maar dacht dat ik op hetzelfde uitkwam als met exec()

Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 18-09 15:14

ATS

Waarom geef je je user niet gewoon een pagina terug, en laat je die pagina met behulp van ajax het resultaat van je commando embedden? Dan kan je je user in elk geval iets presenteren, al is het maar een "even geduld aub" tekstje.
Wat je verder zou kunnen proberen (even aannemende dat het probleem is dat je commando te lang duurt eigenlijk) is de output van je commando sturen naar een file, en deze regelmatig met behulp van ajax lezen. Zo kan je denk ik de output incrementieel in je pagina weergeven.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Je hebt geen last van output buffering.
Bij output-buffering zet PHP zijn output in de buffer van je webserver, en flusht deze het om de zoveel tijd naar de gebruiker.
Bij jou zit PHP gewoon te wachten tot de executie is voltooid en je functie een waarde returned.

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Verwijderd schreef op donderdag 06 december 2007 @ 17:25:
[...]


Zit ik dan nog niet steeds aan die output buffering vast ?

Ik had shell_exec al wel bekeken, maar dacht dat ik op hetzelfde uitkwam als met exec()
Heb je die manualpagina daadwerkelijk gelezen? ;)
Execute command via shell and return the complete output as a string
string shell_exec ( string $cmd )
;)

'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!

Verwijderd

Topicstarter
frickY schreef op donderdag 06 december 2007 @ 17:35:.
Bij jou zit PHP gewoon te wachten tot de executie is voltooid en je functie een waarde returned.
Dit is zeker waar, daar was ik achter.

Dan kan ik natuurlijk de out parsen dat alles klaar is en het bash script lekker verder laten draaien.

Maar als iemand zit te wachten vind ik het altijd wle fijn om te laten weten waarop :)

@-NME-: ja om half 7 vanochtend, vond het wel tijd voor wat slaap toen :9

Het was meer dat ik even niet meer wist wat het beste te gebruiken was, het kan namelijk op vele manieren.

EDIT >>

OK, ik ben er bijna uit:

code:
1
2
3
4
5
6
7
8
$handle = popen("tail -f /etc/httpd/logs/access.log 2>&1", 'r');
while(!feof($handle)) {
    $buffer = fgets($handle);
    echo "$buffer<br/>\n";
    ob_flush();
    flush();
}
pclose($handle);


werkt op zich goed, ik tar alleen iets en dat neem tijd in beslag, dus de HTML er onder wordt niet volledig geparsed.

Ik zie alle commando's uit mijn bash gewoon staan in de bron, ook de tar regel, maar die laat dus op zich wachten.

Nu even kijken hoe ik de output buffering aan moet pakken.(denk ik)

[ Voor 47% gewijzigd door Verwijderd op 06-12-2007 18:35 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil niet vervelend kicken of iets dergelijks, maar ik vroeg mij toch het volgende af:

De manieren die ik vaak tegen gekomen ben ik dat de code geparsed werd in een Textfield welke gelocked was.

De vraag die ik hierdoor heb is is of dit gedaan wordt omdat een pagina dan makkelijker volledig op te bouwen is en de geparste code in een textfield meer dynamisch te manipuleren is.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Ik gok eerder omdat mensen te lui zijn om <pre> te gebruiken ;)

Overigens, waarom gebruik je niet gewoon system?
The system() call also tries to automatically flush the web server's output buffer after each line of output if PHP is running as a server module.
Als output buffering uitstaat (zoals het hoort) doet dat precies hetzelfde als je huidige constructie met popen afaik :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
FragFrog schreef op zaterdag 08 december 2007 @ 17:48:
Ik gok eerder omdat mensen te lui zijn om <pre> te gebruiken ;)

Overigens, waarom gebruik je niet gewoon system?

[...]


Als output buffering uitstaat (zoals het hoort) doet dat precies hetzelfde als je huidige constructie met popen afaik :)
Ik krijg in dat geval de output in 1x. Dus het laadbalkje loopt vol en dan krijg ik de volledige pagina.

Beter dan een lege pagina natuurlijk en dan pas output, maar ik ga opzoek naar de perfecte oplossing :)
Pagina: 1