06. april 2006 - 14:22Der 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?
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?
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".
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.
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.
Synes godt om
Ny brugerNybegynder
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.