Kako pognati PHP skripto "v ozadju"?

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:)

al pa na ip zaklent :)

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