2012-02-15 77 views
0

我正在编写一个PHP脚本,它将在服务器上启动一个程序。PHP exec()不返回

我这样写:

exec('myAppName'); 

这一行的,因为它实际上执行的程序代码“作品”,但是,我不能得到它从该行返回(继续过去的)。

它只会挂在那里,直到我手动关闭打开的程序或超出max_execution_time。

我错过了一些明显的东西吗?

+0

你想“fork”然后执行exec吗?因为'exec'不应该以某种方式“背景”这个过程。 – Borealid 2012-02-15 19:22:05

+1

在黑暗中拍摄,但尝试使用['passthru()'](http://php.net/passthru)而不是'exec()'。程序的输出可能会揭示一些事情。 – 2012-02-15 19:22:18

+0

尝试passthru()以及相同的结果。 – 2012-02-15 19:47:04

回答

0

背景在PHP中的过程中,你需要做这样的事情:

function spawnBackgroundProcess($sProcessLine) 
{ 
    $aPipes = array(); 

    $rProcess = proc_open($sProcessLine, array(), $aPipes); 
    proc_close($rProcess); 
} 

真的多数民众赞成滥用proc_ *系列,但它是可悲的是最好的办法。

(不要忘了&!)

1

manual for exec,而不是在等待启动的程序退出的事情完全清楚,各国的返回值是

返回值:从命令结果的最后一行。

换句话说,就像您正在观察的那样,为了返回最后一行输出,exec将不会返回,直到启动的程序退出。

0

您需要将其作为背景以继续其余的PHP我相信。

在Unix/Linux中,使用“&”字符。 ..

嗯或者是那个系统,那..该死的,不记得现在 - 将再次阅读手册。

+0

我应该在原文中说明,但我在Windows服务器上。 – 2012-02-15 19:49:25

0

如果你想不具有脚本等待结果在后台执行一个命令,就可以执行以下操作:

<?php 
passthru("/usr/bin/php /path/to/script.php ".$argv_parameter." >> /path/to/log_file.log  2>&1 &"); 
?> 

有这里有几件重要的事情。

首先:把完整的路径放到php二进制文件中,因为这个命令将在apache用户下运行,并且你可能没有像在该用户中设置的php那样的命令别名。

秒:注意2在命令字符串末尾的事情:'2> & 1'和'&'。 '2> & 1'用于将错误重定向到标准IO。最重要的是命令字符串末尾的'&',它告诉终端不要等待响应。

三:确保你对 'log_file.log' 文件

享受777个权限!