Avatar billede mindplay Nybegynder
06. april 2006 - 14:22 Der er 7 kommentarer og
1 løsning

script timer ud ved udførsel af eksternt program

Sidder med et problem, som jeg ikke har kunne finde nogen holdbar løsning på...

Jeg skal udføre et eksternt program, og have kommando-linie outputtet tilbage i mit PHP script - det i sig selv er ikke noget problem.

Desværre timer scriptet ud, da den proces der skal udføres laver en meget lang operation, som tager længere end et minut.

Jeg har lavet nedenstående funktion, som jeg vil bruge til at eksekvere det eksterne program:

function run($cmd) {
    $buffer = array();
    $handle = popen($cmd, "r");
    while (!feof($handle)) {
        set_time_limit(10); // 10 minutters timeout
        $line = fgets($handle);
        if ($line !== FALSE) {
            $buffer[] = $line;
        }
        // skriv et punktum og flush:
        print ".";
        ob_flush();
        flush();
        sleep(1); // vent 1 sek.
    }
    pclose($handle);
    return $buffer;
}

Min idé med ovenstående var: bliv ved med at sætte en ny timeout, hvert sekund, indtil programmet er færdigt med at køre.

Desværre returnerer fgets() ikke før der er kommet en linie tekst fra programmet man er ved at udføre, så det duer ikke - mit script går i stå inde i loop'et og timer ud.

Tænkte, at jeg måske kunne bruge fstat() til at tjekke, om der er kommet nye data fra processen, inden jeg kalder fgets() - men fstat() på et handle fra en proces returnerer altid size=0, så denne funktion hjælper mig ikke.

Er der ingen måde, hvor man kan tjekke, om der er kommet nye data?
Avatar billede coderdk Praktikant
06. april 2006 - 14:36 #1
Hvad med bare at smide set_time_limit(0); i toppen? Så er der ikke en timeout grænse...
Avatar billede mindplay Nybegynder
06. april 2006 - 14:42 #2
det løser kun halvdelen af mit problem ... jeg har stadig ingen mulighed for at give brugeren noget visuelt feedback, der fortæller ham, at mit script laver noget.

mener i øvrigt ikke man kan sætte en længere timelimit end den der er sat i php.ini?
Avatar billede coderdk Praktikant
06. april 2006 - 14:54 #3
print ".\n";
  ob_flush();
  flush();

Så burde du få output.

Du kan godt overstige det timelimit der er i php.ini, men ikke hvis din udbyder ikke tillader dette...
Avatar billede mindplay Nybegynder
06. april 2006 - 15:30 #4
det er jo også det jeg gør?

og jeg får skam output ... men naturligvis kun når sætningen bliver udført - hvilket den ikke går så længe PHP sidder fast inde i fgets() og venter på output fra processen, hvilket ikke kommer før det er "for sent".
Avatar billede coderdk Praktikant
06. april 2006 - 16:11 #5
Nej, bemærk at jeg har sat et linjeskift ind \n
Avatar billede mindplay Nybegynder
06. april 2006 - 16:38 #6
det gør ingen forskel.

som sagt, den skriver godt nok ud - det er ikke problemet ... den sidder fast inde i fgets(), og kommer ikke ud og fortsætter i mit script igen før processen returnerer en linie tekst.
Avatar billede smirnoff Nybegynder
06. april 2006 - 17:09 #7
nej - og det kommer den aldrig til, dit script KAN ikke fortsætte før processen returnerer
Avatar billede mindplay Nybegynder
07. april 2006 - 13:01 #8
Jeg har løst problemet - ganske vist på en "grim" måde...

Jeg har lavet en batch-fil, som jeg bruger til at starte selve programmet, dvs. noget i stil med:

@echo off
%1 %2 %3 %4 %5 %6 %7 %8 %9 > output.txt
echo DONE > done.txt

Når jeg starter batch-filen fra PHP, bruger jeg start-kommandoen, f.eks. "START opstart.bat mitprogram.exe input.fil output.fil" ... således at udførslen ikke blokkerer i PHP. Så har jeg et loop i min PHP-funktion, der hvert sekund tjekker om "done.txt" filen findes - når den dukker op, henter jeg outputtet fra programmet, som ligger i "output.txt", og sletter derefter begge filer.

En noget klodset løsning, men det fungerer fint.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester