PHP:exec()即使使用“> / dev / null 2>& 1&”也不会在后台运行

时间:2012-09-18 12:18:26

标签: php process background exec

我在我的php脚本中调用它:

    exec("gutschein.php >/dev/null 2>&1 &");

调用脚本(生成pdf并通过电子邮件发送)可以正常工作,但过程没有在后台运行(我在gutschein.php中使用sleep语句检查了它)。浏览器一直挂起,直到执行gutschein.php完成。

我还检查了以下内容:

    exec("/usr/bin/php gutschein.php >/dev/null 2>&1 &");

shell_exec("/usr/bin/php gutschein.php >/dev/null 2>&1 &");

它不会改变任何东西。该脚本实际上是在linux服务器上运行的。有谁知道我做错了什么?

7 个答案:

答案 0 :(得分:4)

尝试系统和/或passthru。我以前遇到过exec的问题,因为它停止尝试用数据填充返回数组,直到进程完成。

这些都会回显原始输出,所以即使它们工作,你也可能需要用丢弃的输出缓冲区处理它。

答案 1 :(得分:1)

您可以使用屏幕:screen -d -m /usr/bin/php gutschein.php

如果您需要有关选项的更多信息,

Here是屏幕手册。

答案 2 :(得分:1)

请参阅HERE的经验。 我尝试和为我工作的方式 -

php -q /path/to/my/test/script/cli_test.php argument1 < /dev/null &

在PHP中,它就像

exec('php -q /path/to/my/test/script/cli_test.php argument1 < /dev/null &')

答案 3 :(得分:0)

您可以尝试使用以下两个命令之一从PHP运行后台作业:

$out = shell_exec('nohup /usr/bin/php /path/to/gutschein.php >/dev/null 2>&1 &');

OR

$pid = pclose(popen('/usr/bin/php gutschein.php', 'r'));

它将在后台执行命令并返回PID,您可以使用条件$pid > 0进行检查以确保它有效。

答案 4 :(得分:0)

必须重定向所有输出,否则只要执行gutschein.php,脚本就会挂起。试试

exec('/usr/bin/php gutschein.php &> /dev/null &');

答案 5 :(得分:0)

    /**
     * @author Micheal Mouner
     * @param String $commandJob
     * @return Integer $pid
     */
    public function PsExec($commandJob)
    {
        $command = $commandJob . ' > /dev/null 2>&1 & echo $!';
        exec($command, $op);
        $pid = (int) $op[0];
        if ($pid != "")
            return $pid;
        return false;
    }

这对我有用..检查一下

同样,返回后台进程的进程ID

答案 6 :(得分:-2)

浏览器可能正在等待响应,因此让脚本生成任何输出并终止“主进程”。一个简单的

die('ok');

应该做的。


顺便说一句,通过调用exec来分配新进程可能不是最好的解决方案,因为新进程不是真正的子进程 - 意味着你无法控制它。您可以考虑使用pcntl(http://php.net/manual/de/book.pcntl.php)来实现此目的。但是很明显,这个扩展也存在他的陷阱,特别是在网络服务器的背景下。