12

我在我的 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 服务器上运行的。有人知道我做错了什么吗?

4

7 回答 7

4

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

这些都将回显原始输出,因此即使它们有效,您也可能需要使用丢弃的输出缓冲区来处理它。

于 2012-11-01T14:58:54.850 回答
1

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

如果您需要有关选项的更多信息,这里是屏幕手册。

于 2012-11-01T15:29:20.193 回答
1

请在此处查看我的经验。我尝试并为我工作的方式 -

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 &')
于 2014-03-28T06:29:47.110 回答
1

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

exec('/usr/bin/php gutschein.php &> /dev/null &');
于 2012-09-18T12:30:33.770 回答
1
    /**
     * @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;
    }

这对我有用..检查一下

另外,返回后台进程的processId

于 2012-10-10T11:03:19.757 回答
1

您能否尝试以下 2 个命令之一从 PHP 运行后台作业:

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

或者

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

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

于 2012-09-18T12:29:52.807 回答
-3

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

die('ok');

应该做的工作。


顺便说一句,通过调用 exec 来分叉一个新进程可能不是最好的解决方案,因为新进程不是真正的子进程——这意味着你无法控制它。您可以考虑为此目的使用 pcntl ( http://php.net/manual/de/book.pcntl.php )。但要清楚,这个扩展也有他的缺陷,尤其是在网络服务器的上下文中。

于 2012-09-18T12:30:19.467 回答