Gå til innhold

Sette timeout for en funksjon?


Anbefalte innlegg

Videoannonse
Annonse

Man kan sleepe prosessen ved hjelp av http://no.php.net/manual/en/function.usleep.php, men da holder du igjen hele prosessen og det er ikke optimalt.

 

Mitt tips (hvis jeg antar rett at du skal ha dynamisk innhold) er å heller ha et ajax-kall på en php-side hvert sekund (eller senere/oftere) og oppdatere viewet om det er forandring :) Her har du funksjonene setTimeout og setInterval i JavaScript som fungerer utmerket til videre eksperimentering.

Lenke til kommentar

Det er ikke noen ideell løsning når jeg har funksjoner som jeg vet kan henge seg i hele den globale timeouten. Selv om klienten slutter å se etter skriptet vil jo skriptet fortsette å kjøre på serveren til det timer ut.

 

Ideelt sett burde man kunne starte en php-funksjon i "bakgrunnen", sjekke om den er ferdig med noen millisekunders mellomrom og kunne kanselere funksjonen om en grenseverdi overskrides.

 

Det blir nok å hacke til noe med exec, det er en bedre løsning enn å måtte la serveren ta interne ting via klient i javascript.

Lenke til kommentar

Utfordringen er at jeg har ett par oppgaver som bare låser seg, og jeg vet at om de ikke svarer på ett halvt sekund så henger de til skriptet timer ut av seg selv. Nå er det systemkall, så problemet kan løses med å kjøre exec() med en systemkommando i bakgrunnen og sjekke prosessid'en fra det kallet i bakgrunnen og deretter kjøre kill på prosessen og gjøre feilretting om den ikke er borte på x antall millisekunder.

 

Leser om denne fork-funksjonen for å se om den kan brukes uten altfor grisete programmering.

Lenke til kommentar

Du kan kanskje eksperimentere med set_time_limit(n) eller ini_set(max_execution_time), men jeg har en mistanke om at du må revurdere designet ditt dersom du tror du må bruke fork, time limit eller exec() fra ett kall fra nettleseren. I alle fall bør det gjøres med forsiktighet. :huh:

Endret av dahuff
Lenke til kommentar

Hvis det er noe som har en tendens til å henge seg, så ser jeg ikke problemet med å splitte det ut. Man kan oppnå noe kontroll over eksekveringen i stedet for at det tar lang tid og når timeout. Går det et sekund kan man f.eks. sende SIGHUP, SIGTERM eller SIGKILL avhengig av hvor aggresiv man ønsker å være, og bli kvitt «problemet».

Lenke til kommentar
  • 2 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...