3

我有这个运行良好的 exec 命令,但没有释放浏览器(即存在 php 超时问题,但实际命令继续运行):

exec("/usr/local/php53/bin/php csv.php $file $user > /dev/null");

当我运行时,ps auxw我看到这两个正在运行的进程:

sh -c /usr/local/php53/bin/php csv.php /tmp/php9Pwu9e 294  >
/usr/local/php53/bin/php csv.php /tmp/php9Pwu9e 294

但是,当我运行下面的代码时,浏览器立即空闲,但命令不会继续运行:

exec("/usr/local/php53/bin/php csv.php $file $user > /dev/null &");

当我运行时, ps auxw我看到一个正在运行的进程在 16 秒后终止(并且似乎很快耗尽了内存并使用了大量的 CPU%):

/usr/local/php53/bin/php csv.php /tmp/php9Pwu9e 294

然后这个过程在没有实际做任何事情的情况下就结束了。不确定&符号在做什么会导致这种情况。

另外,为什么sh -c最后没有&符号时会出现?我觉得这可能预示着什么,但不知道是什么。

编辑:

因为这不断作为答案出现,所以我也尝试过:

exec("/usr/local/php53/bin/php csv.php $file $user > /dev/null 2>&1 &");

这证明了与上述相同的问题。下面的代码会运行,但不会释放浏览器。

exec("usr/local/php53/bin/php csv.php $file $user > /dev/null 2>&1");
4

3 回答 3

0

试试这个

exec("nohup php csv.php $file $user > /dev/null &");

于 2013-01-28T07:45:26.457 回答
0

尝试将输出和错误都重定向到/dev/null(或您选择的另一个输出文件,前提是它为运行 Web 服务器的用户设置了写入权限),以及使用 & 号使其成为后台进程,如上所述PHP 手册用户说明:

<?php

exec("php /var/www/foo.php > /dev/null 2>&1 &");

刚刚试了一下,它按预期工作:调用脚本立即完成,后台进程一直运行,只要它需要完成。

于 2013-01-28T17:57:30.833 回答
0

这个问题比我想象的要简单得多。问题是$file(这是存储在/tmp目录中的上传文件)未找到。我不知道为什么,但我想这与在后台进程可以到达之前被销毁的文件有关。

解决方案是move_uploaded_file()将文件保存到永久位置,并使用该文件运行脚本。那行得通。

于 2013-01-29T03:00:35.023 回答