2012-02-11 54 views
0

我试图通过让PHP到餐桌的过程给exec PHP,同时在后台取得PHP给exec PHP

管道输出到/ dev/null,并且运行CMD在我得到这个静默运行 - 我想检查cmd运行如预期 - 但是,当命令执行PHP时,进程(master和fork)永不终止,并且浏览器被forver卡住在“Connecting ...”上

这里是代码:

$script = '/home/username/application/bg_job.php'; 
$args = 'foo bar'; 

$cmd = "php -f $script $args"; 
$return = exec($cmd, $arr_output, $code); 

var_dump($return); 

我检查了由doi运行脚本的Apache用户NG

whoami 

,这是 “用户名” - 所以我以root身份登录并运行

sudo -u username php -f /home/username/application/bg_job.php foo bar 

和它的作品。

任何想法,我可能做错了什么?

编辑 - 仅供参考 - 这里是bg_job.php

<?php 
    file_put_contents('/home/username/test.txt', 'Hello !'); 
?> 
+0

你想从浏览器(如在你的描述中)或从cli(如在你的标签)运行这个 – 2012-02-11 01:07:13

+0

CLI代码只是为了表明脚本运行(没有语法或许可错误) - 它会调用子进程的浏览器 – cloakedninjas 2012-02-11 01:28:37

+0

很可能你正在遇到权限错误。既然你实际上通过网页浏览器调用你的命令,例如RUN_USER = www-data和RUN_GROUP = www-data,你的后台脚本必须设置必要的位,以便你的web进程可以执行你的bg_job.php。另外,您希望bg_job.php写入的输出文件也必须设置正确的权限位。 – 2012-02-11 11:27:31

回答

0

我认为你正试图煽动后台任务的内容。在Linux下可以使用的ampersand来完成:

php -f /var/file.php & 

上有this blog post更多细节。

所以,你的命令将变成:

$cmd = "php -f $script $args &"; 
+0

试过 - 没有改变 - 是的,我会将此作为背景任务 - 但仅限于它的工作原理。即使使用& - 我的子脚本永远不会运行:( – cloakedninjas 2012-02-11 01:25:22

+0

哦,我没有从你的问题中得到这个,我以为你说它正在运行,并且会让你的Apache进程等待'exec'回来。参见:然而,当命令被PHP执行时,进程(master和fork)都不会终止,并且浏览器会被困在“Connecting ...”上。这不仅仅意味着它正在工作。 – Treffynnon 2012-02-11 08:07:08

+0

但它不起作用 - 所有bg_job.php都会写入文本文件 - 但该文本文件永远不会被创建。 – cloakedninjas 2012-02-11 09:44:54

0

什么我发现是,如果你想获得一个后台进程运行,你必须使用proc_open

为什么这样工作我完全没有理解,但是无论何时关闭proc资源,程序都不会结束执行。

它也会,如果正确完成,不会导致任何东西挂起。

这就是我的意思。

$sCommand = "php -f /home/username/application/bg_job.php > /dev/null 2>&1 &"; 

$aPipes = array(); 

$rProcedure = proc_open($sCommand, array(), $aPipes); 
proc_close($rProcedure); 

你会发现它会在后台运行,并且在Apache完成它所做的事情后不会死亡。