我正在编写一个PHP脚本,它将在服务器上启动一个程序。PHP exec()不返回
我这样写:
exec('myAppName');
这一行的,因为它实际上执行的程序代码“作品”,但是,我不能得到它从该行返回(继续过去的)。
它只会挂在那里,直到我手动关闭打开的程序或超出max_execution_time。
我错过了一些明显的东西吗?
我正在编写一个PHP脚本,它将在服务器上启动一个程序。PHP exec()不返回
我这样写:
exec('myAppName');
这一行的,因为它实际上执行的程序代码“作品”,但是,我不能得到它从该行返回(继续过去的)。
它只会挂在那里,直到我手动关闭打开的程序或超出max_execution_time。
我错过了一些明显的东西吗?
背景在PHP中的过程中,你需要做这样的事情:
function spawnBackgroundProcess($sProcessLine)
{
$aPipes = array();
$rProcess = proc_open($sProcessLine, array(), $aPipes);
proc_close($rProcess);
}
真的多数民众赞成滥用proc_ *系列,但它是可悲的是最好的办法。
(不要忘了&!)
的manual for exec
,而不是在等待启动的程序退出的事情完全清楚,各国的返回值是
返回值:从命令结果的最后一行。
换句话说,就像您正在观察的那样,为了返回最后一行输出,exec
将不会返回,直到启动的程序退出。
您需要将其作为背景以继续其余的PHP我相信。
在Unix/Linux中,使用“&”字符。 ..
嗯或者是那个系统,那..该死的,不记得现在 - 将再次阅读手册。
我应该在原文中说明,但我在Windows服务器上。 – 2012-02-15 19:49:25
如果你想不具有脚本等待结果在后台执行一个命令,就可以执行以下操作:
<?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个权限!
你想“fork”然后执行exec吗?因为'exec'不应该以某种方式“背景”这个过程。 – Borealid 2012-02-15 19:22:05
在黑暗中拍摄,但尝试使用['passthru()'](http://php.net/passthru)而不是'exec()'。程序的输出可能会揭示一些事情。 – 2012-02-15 19:22:18
尝试passthru()以及相同的结果。 – 2012-02-15 19:47:04