2

我有一个长时间运行的 PHP 脚本,我想在用户操作后在服务器的后台执行。并且用户应该被重定向到其他页面,而命令应该在后台运行。下面是代码

$command = exec('php -q /mylongrunningscript.php');
header("Location: /main.php?action=welcome");

上面的脚本运行良好,但页面在执行之前不会重定向 $command = exec('php -q /mylongrunningscript.php');

我希望该用户应立即重定向到欢迎页面。

有没有其他方法可以完成这个任务。另一个想法是 $command = exec('php -q /mylongrunningscript.php'); 应该在欢迎页面上执行,但是在命令执行后会显示欢迎页面 HTML。命令大约需要 5,6 分钟,并且此时间页面不会重定向。

我在 Cent os Linux 上使用 PHP 5.3

4

3 回答 3

3

你可以试试这个:

$result = shell_exec('php -q /mylongrunningscript.php > /dev/null 2>&1 &');

PS:请注意,这是将 stdout 和 stderr 重定向到/dev/null如果要捕获输出,请使用:

$result = shell_exec('php -q /mylongrunningscript.php > /tmp/script.our 2>&1 &');

或者使用这个 PHP 函数在后台运行任何 Unix 命令:

//Run linux command in background and return the PID created by the OS
function run_in_background($Command, $Priority = 0) {
    if($Priority)
        $PID = shell_exec("nohup nice -n $Priority $Command > /dev/null & echo $!");
    else
        $PID = shell_exec("nohup $Command > /dev/null & echo $!");
    return($PID);
}

礼貌:发表在http://php.net/manual/en/function.shell-exec.php上的评论

于 2013-01-02T09:34:53.900 回答
2

exec()PHP 手册页所述:

如果使用此函数启动程序,为了使其继续在后台运行,程序的输出必须重定向到文件或另一个输出流。否则将导致 PHP 挂起,直到程序执行结束。

所以让我们这样做,使用2>&1(基本上 2 isstderr和 1 is stdout,所以这意味着“将所有 stderr 消息重定向到 stdout ”):

shell_exec('php -q /mylongrunningscript.php 2>&1');

或者如果你想知道它输出什么:

shell_exec('php -q /mylongrunningscript.php 2>&1 > output.log');
于 2013-01-02T09:36:27.740 回答
1

将脚本输出发送到 /dev/null,exec 函数将立即返回

$command = exec('php -q /mylongrunningscript.php > /dev/null 2>&1');
于 2013-01-02T09:36:10.787 回答