我有这个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");
答案 0 :(得分:0)
试试这个
exec(“nohup php csv.php $ file $ user> / dev / null&”);
答案 1 :(得分:0)
尝试将输出和错误重定向到/dev/null
(或您选择的其他输出文件,前提是它具有为运行Web服务器的用户设置的写入权限),并将其设置为后台使用&符进行处理,如PHP manual user note:
<?php
exec("php /var/www/foo.php > /dev/null 2>&1 &");
尝试了它并且它按预期工作:调用脚本立即完成,后台进程一直运行所需的时间。
答案 2 :(得分:0)
这个问题比我想象的要简单得多。问题是找不到$file
(这是一个存储在/tmp
目录中的上传文件)。我不确定为什么,但我想它与后台进程可以达到它之前被销毁的文件有关。
解决方案是将move_uploaded_file()
文件移至永久位置,然后使用该文件运行脚本。这很有用。