[PHP] exec van shell script - output in page?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • zaphod_b
  • Registratie: Oktober 2001
  • Laatst online: 15:33
Hoi

Ik wil vanuit een PHP script een bash script uitvoeren (Linux). Nu duurt dit scriptje nogal lang (>30min) en blaat veel output. Ik wil niet wachten tot 'ie helemaal klaar is en dan de output pas richting browser echo'en.

Heb vreselijk veel gezocht en geprobeerd (php.net) maar ik kom er niet uit. Ik kan me niet voorstellen dat dit erg moeilijk is, maar ik snap er niets meer van..

Nu ben ik ook niet zo'n programmeur en ook al niet in PHP... maar goed. Is er hier een guru die dit even uit z'n mouw schudt? Zou er errug blij mee zijn want ben al uren aan het vrotten ;).

BVD!

Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Als die sowieso moet blijven runnen denk ik dat dit wel goed werkt:
system("script &> /dev/null");

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
Shadowman schreef op maandag 03 april 2006 @ 12:17:
Als die sowieso moet blijven runnen denk ik dat dit wel goed werkt:
system("script &> /dev/null");
ik denk niet dat dit is wat hij bedoelt..

@TS:
ik weet niet wat voor scriptje het is, maar je zou natuurlijk ook kunnen scripten in php, en niet in bash.
zo krijg je meerdere commando's in php, met dus allemaal kleinere beetje output.

verder weet ik niet hoe php omgaat met threads enzo, maar ze hebben wel een 'flush()' functie, deze werkt normaal om de output buffer te flushen, maar ik weet niet of dit ook kan met een system call. denk eerlijk gezegt van niet

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • zaphod_b
  • Registratie: Oktober 2001
  • Laatst online: 15:33
Shadowman schreef op maandag 03 april 2006 @ 12:17:
Als die sowieso moet blijven runnen denk ik dat dit wel goed werkt:
system("script &> /dev/null");
Ehm ik wil de output dus over het scherm zien rollen in m'n browser. Niet naar de eeuwige bitvelden ;).

Acties:
  • 0 Henk 'm!

Verwijderd

Ik had laatst ook zoiets, maar dan wel met een andere php script wat erg lang runt en wat niet afgebroken mag worden. Ik had wel iets aan dit topic:

[rml][ PHP] PHP script starten vauit een Script[/rml]

vooral
ob_start();
ob_end_flush();
ignore_user_abort(true)

Acties:
  • 0 Henk 'm!

  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 07-07 15:40
Het simpelts is gewoon om je script naar een file the outputten b.v. >log.txt.
Je zorgt dat dit bestand voor je php-server bereikbaar is.
(Je kan ftp gebruiken om te voorkomen dat hij met fouten komt om dat het bestand ingebruik is)

Je laat een klein (i)frame op de pagina het bash script starten. En een andere iframe laat je om de 30sec refreshen en de inhoud van het bestand b.v. log.txt weer geven.
Of je haalt de log-text via AJAX of hidden iframe regel voor regel uit het bestand binnen.

Dus 2 aparte php-scripts, je kan het zien als threats waarbij je useroutput en processing scheid :)

[ Voor 13% gewijzigd door djexplo op 03-04-2006 12:44 ]

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Ah ok,

Voldoet de mogelijkheid om popen daarvoor te gebruiken icm flush() niet?

http://php.net/popen
http://php.net/flush

Acties:
  • 0 Henk 'm!

Verwijderd

@djexplo: Je kan zoveel containers om het script heenbouwen als je wilt, maar dat is niet de kern van het probleem natuurlijk.

p.s. vergeet niet de max exec time te verhogen voor je script: set_time_limit(3600);

[ Voor 26% gewijzigd door Verwijderd op 03-04-2006 13:18 ]


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 15-08 12:34
Jawel.
Het programma forken met popen, en de output echo-en gevolgt door een flush.
Zodra de buffer van je browser vol is (meestal 1024kb) zie je bij elke flush vanzelf meer en meer content verschijnen.

Acties:
  • 0 Henk 'm!

  • zaphod_b
  • Registratie: Oktober 2001
  • Laatst online: 15:33
frickY schreef op maandag 03 april 2006 @ 12:58:
Jawel.
Het programma forken met popen, en de output echo-en gevolgt door een flush.
Zodra de buffer van je browser vol is (meestal 1024kb) zie je bij elke flush vanzelf meer en meer content verschijnen.
Kun je mij een beetje een hint geven hoe dit er uit ziet in code? Zie het nog niet helemaal voor me.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12-08 12:13

Creepy

Tactical Espionage Splatterer

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • zaphod_b
  • Registratie: Oktober 2001
  • Laatst online: 15:33
Ah, gelukt inderdaad met popen!

Thanks.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function run_in_background($Command)
{
    echo "Running $Command...";
    echo "<PRE>";
    $handle = popen("$Command 2>&1", 'r');
    while(!feof($handle)) 
    {
        $buffer=fgets($handle);
        echo "$buffer<br/>\n";
        ob_flush();
        flush();
    }
    pclose($handle);
    echo "</PRE>";
}

[ Voor 19% gewijzigd door zaphod_b op 03-04-2006 14:51 ]

Pagina: 1