0

我有以下exec()命令,&末尾有一个符号,因此脚本在后台运行。但是该脚本并未在后台运行。正好 5.6 分钟后,它在浏览器中超时。此外,如果我关闭浏览器,脚本不会继续运行。

 exec("/usr/local/bin/php -q /home/user/somefile.php &")

如果我通过命令行运行脚本,它不会超时。我的问题是如何防止超时。我如何使用 exec 在后台运行脚本,所以它不依赖于浏览器。我做错了什么,我应该看什么。

4

2 回答 2

4

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 &");
于 2012-11-29T23:04:56.030 回答
0

您需要shell_exec()改用:

shell_exec("/usr/local/bin/php -q /home/gooffers/somefile.php &");

话虽这么说,如果您有 shell 访问权限,为什么不将其安装为 cronjob?我不确定为什么一个 PHP 脚本会调用另一个脚本来像这样运行。

于 2012-11-29T22:51:39.227 回答