Kako pognati PHP skripto "v ozadju"?
6 naročnikov
6 naročnikov
Lep pozdrav vsem skupaj!
Kako ste kaj? Jaz popizdevam nad Linuxom ... :)
Naj opišem situacijo. Recimo, da imam PHP skripto "parent.php" in skripto "child.php". Skripta "child.php" se izvaja 10 minut.
V skripti "parent.php" imam nekaj kode, nato SPROŽIM skripto "child.php", ki naj se v miru izvaja, skripta "parent.php" pa TAKOJ nadaljuje z delom in NE čaka na output skripte "child.php".
V praksi to pomeni, da se skripta "parent.php" izvaja pol sekunde in v tem času pokliče skripto "child.php". Skripta "child.php" pa se potem izvaja svojih 10 minut in opravi vse težaško delo.
A je do tukaj še vse jasno? :)
No, trik je v tem, da sem poskusil že miljon enih opcij.
1.) V skripti "parent.php" sem klical skripto "child.php" z ukazom exec("/usr/bin/php /home/nekuser/nekamapa/child.php >/dev/null 2>&1");. To NI bilo uspešno, "parent.php" je čakal na output in se izvajal 10 minut.
2.) Potem sem poskusil z exec("/usr/bin/php /home/nekuser/nekamapa/child.php&");, ki naj bi skripto pognal v backgroundu. Žal je zgodba povsem enaka.
3.) Nato sem poskusil z pclose(popen("/usr/bin/php /home/nekuser/nekamapa/child.php&", "r"));. Srce je za trenutek vztrepetalo! Stvar dela! Well, not really.
V tem primeru stvar res dela, če "parent.php" poženem iz konzole (SSH - PuTTY), in to povsem pravilno! Če pa jo poženem z obiskom te skripte prek URLja z brskalnikom, pa spet NE dela in se "child.php" sploh ne izvede. V tem primeru se sicer "parent.php" res izvede v sekundi, ampak se "child.php" sploh NE pokliče.
Ima mogoče kdo kakšno idejo, kako bi lahko rešil ta problem? Povsod po netu najdem predloge, da bi stvar z ">/dev/null 2>&1" morala delovati. Ampak na mojem serverju žal ne. Wtf.
Uporabljam ServInt VPS za $89 mesečno. Njihov support je brez moči.
Please help meh. !!! 11 stofakingenajsttisoč !
Anže
14 odgovorov
dunker, super rešitev (enako kot CURL multi), če hočeš omejitev pa enostavno dodej npr. ?pass=1234 in preveri vskripti, če je pass prisoten. Za osnovn o preprečitev dostapa od zunej bo, ne pozabi naredi password malce težji kot 1234:)
Mhm, dobra ideja. Čeprav gre v bistvu za povsem nekritično skripto, jo bom vseeno zaklenil na IP, zakaj pa ne, ziher je ziher. :)
Hvala vsem še enkrat. :)
Hm, ne vem kako da imaš ti take probleme, ampak this works everywhere, afaik:
shell_exec('nohup nice -n 0 php child.php > /dev/null & echo $!');
LP, Pete