我有这个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");
试试这个
exec("Nohup PHP CSV.php $file $user>/dev/null &");
尝试将
输出和错误重定向到 /dev/null
(或您选择的另一个输出文件,前提是它为运行 Web 服务器的用户设置了写入权限),以及使用与号使其成为后台进程,如 PHP 手册用户说明中所述:
<?php
exec("php /var/www/foo.php > /dev/null 2>&1 &");
刚刚尝试过,它按预期工作:调用脚本立即完成,后台进程继续运行,只要完成。
这个问题比我想象的要简单得多。问题是找不到$file
(这是存储在/tmp
目录中的上传文件)。我不确定为什么,但我想这与在后台进程到达之前被销毁的文件有关。
解决方案是将文件move_uploaded_file()
到永久位置,然后使用该文件运行脚本。这奏效了。