我有以下exec()
命令,最后带有&
符号,因此脚本在后台运行。但是,脚本未在后台运行。在5.6分钟后,它在浏览器中超时。此外,如果我关闭浏览器,脚本将不会继续运行。
exec("/usr/local/bin/php -q /home/user/somefile.php &")
如果我通过命令行运行脚本,它不会超时。我的问题是如何防止超时。我如何使用exec在后台运行脚本,因此它不依赖于浏览器。我做错了什么,我应该看什么。
答案 0 :(得分:3)
exec()
函数处理执行程序的输出,因此我建议您将输出重定向到/dev/null
(一个虚拟可写文件,它会自动丢失您写入的每个数据)。
尝试运行:
exec("/usr/local/bin/php -q /home/gooffers/somefile.php > /dev/null 2>&1 &");
注意:2>&1
将错误输出重定向到标准输出,> /dev/null
将标准输出重定向到该虚拟文件。
如果仍有困难,可以创建一个只执行其他脚本的脚本。 exec()
在执行任务时遵循进程,但在任务完成时发布。如果执行的脚本只执行另一个脚本,则任务非常快,并且exec以相同的方式释放。
让我们看一个实现。创建一个包含以下内容的exec.php
:
<?php
if (count($argv) == 1)
{
die('You must give a script to exec...');
}
array_shift($argv);
$cmd = '/usr/local/bin/php -q';
foreach ($argv as $arg)
{
$cmd .= " " . escapeshellarg($arg);
}
exec("{$cmd} > /dev/null 2>&1 &");
?>
现在,运行以下命令:
exec("/usr/local/bin/php -q exec.php /home/gooffers/somefile.php > /dev/null 2>&1 &");
如果你有参数,你也可以给他们:
exec("/usr/local/bin/php -q exec.php /home/gooffers/somefile.php x y z > /dev/null 2>&1 &");
答案 1 :(得分:0)
您需要使用shell_exec()
代替:
shell_exec("/usr/local/bin/php -q /home/gooffers/somefile.php &");
话虽这么说,如果你有shell访问权限,为什么不把它作为cronjob安装?我不确定为什么PHP脚本会像这样运行另一个脚本。