Php Exec超时

时间:2012-11-29 22:48:37

标签: php timeout exec

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

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

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

2 个答案:

答案 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脚本会像这样运行另一个脚本。