我有以下exec()
命令,&
末尾有一个符号,因此脚本在后台运行。但是该脚本并未在后台运行。正好 5.6 分钟后,它在浏览器中超时。此外,如果我关闭浏览器,脚本不会继续运行。
exec("/usr/local/bin/php -q /home/user/somefile.php &")
如果我通过命令行运行脚本,它不会超时。我的问题是如何防止超时。我如何使用 exec 在后台运行脚本,所以它不依赖于浏览器。我做错了什么,我应该看什么。
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 &");
您需要shell_exec()
改用:
shell_exec("/usr/local/bin/php -q /home/gooffers/somefile.php &");
话虽这么说,如果您有 shell 访问权限,为什么不将其安装为 cronjob?我不确定为什么一个 PHP 脚本会调用另一个脚本来像这样运行。