[PHP] DOS-Prompt opvangen en weergeven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Hoi,

Ik zoek eigenlijk een manier om via php een shell commando te laten uitvoeren en de output vervolgens op de clientside te laten zien, maar dat deze output wel wordt geüpdate en een heel eind door kan gaan. Ik weet niet zo goed waar ik moet beginnen met denken.

exec() of shell_exec() is niet letterlijk bruikbaar omdat die ineens de hele output teruggeeft, waar je dan gewoon heel lang op moet wachten (en de executiontime van php moet omhoog maar dat is geen probleem).

Kan de output van een commando ook via cron gequeried worden? Ik kan best elke minuut een cron scriptje draaien maar wederom.. kan dat volgens mij niet een door php losgelaten proces weer oppakken om te kijken of er nieuwe output is.

Ik hoop dat duidelijk is wat ik bedoel. Is dit überhaupt mogelijk?

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Je zou met output buffering dit kunnen doen, mits exec niet eerst zn complete respons afwacht. Volgens mij doet ie dat namelijk wel, en is er geen mogelijkheid waarop je dit kunt doen. Tenzij je natuurlijk met een ajax achtige implementatie gaat spelen. Maar err, is het nuttig om dit te laten zien? Of is het "gewoon gaaf" oid?

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Als je heel veel output verwacht die je realtime wilt weergeven kun je het makkelijkst http://nl2.php.net/manual/en/function.popen.php gebruiken. Die returned een handler en dan kun je zelf kiezen om de hoeveel bytes / tijd je iets laat zien. Daarnaast zou je het process ook naar een file kunnen laten schrijven die je via PHP weer uitleest; maar dat is dan waarschijnlijk een beetje een omweg? Wellicht kun je toelichten wat voor applicatie je serverside wil draaien?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Je zou het process op de achtergrond kunnen laten starten, en het process z'n output redirecten naar een file, en die file dan om de x seconden inlezen en weergeven?

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Voor het gemak was ik vergeten te vermelden waar ik mee bezig ben; ik heb een php batch renderer voor een frameserver (command line video tool) gemaakt, maar nu gebeurt alles blind en heb je nooit een idee hoe lang het nog duurt. Nu wil ik dit uitbreiden zodat ik clientside kan zien wat de output zegt, en dat het script aan de hand hiervan ook kan zeggen op hoeveel procent ie ongeveer is.

Dat file schrijven idee klinkt goed, maar ik kan geen exec() gebruiken omdat die de output van command niet 'live' streamt. Hiervoor zou ik popen() kunnen gebruiken? Ik vind de manual beetje kort daarover.

Kan ik in plaats van een textbestand ook een MySQL verbinding open houden, of is dat killing? (De update kan per 10 minuten zijn, maar ook 10 per seconde als het meezit. Maar dat kan ik natuurlijk limiteren naar seconden oid.)

Hier is pseudo-code waar technisch niets van klopt maar om even aan te geven waar ik nu aan denk. Weet niet of dat mogelijk is of nergens op slaat. (Let dus niet op de kneus-semantiek, ik prefereer altijd om na te denken in bullsh-code ipv uml oid :P)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// Cron
// $jobs = batch met taken uit de database
// $busy = flag of popen al bezig is (in database)
if (!$busy && (count($jobs) > 1)) {
    $busy = true;
    $busyWith = $currentJob;
    $jobs--;
    $handle = popen($jobs["renderCommando"], 'r');
    while(!eof($handle)) {
        leesLaatsteOutput();
        berekenVoortgang();
        voortgangEnOutputInDB();
        // Ik kan bijvoorbeeld de laatste 20 regels in de db houden en het berekende %
    }
    pclose($handle);
}


PHP:
1
2
3
4
5
<?php
// Voor clientside
echo $jobs;
// JavaScript
AjaxVoortgang($currentJob);

[ Voor 6% gewijzigd door Sando op 18-01-2009 16:22 ]

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Wellicht simpeler om gewoon vanuit de client te pollen (om de x seconden de status opvragen). Dan hoef je niet een ingewikkeld script te maken. Je laat alleen het cron script de status ergens wegschrijven en een ander simpel script die gegevens aan laten leveren aan de browser.
Pagina: 1