【问题标题】:Is timeout possible in exec function in php?php中的exec函数是否可以超时?
【发布时间】:2014-02-19 07:20:53
【问题描述】:

我希望exec() 在 php 中在给定时间后停止执行。
例如:

exec("/usr/local/bin/wrun 'uptime;ps -elf|grep httpd|wc -l;free -m;mpstat'",$admin_uptime)

20 秒后停止处决。
有没有可能……??

<?php
exec("/usr/local/bin/wrun 'uptime;ps -elf|grep httpd|wc -l;free -m;mpstat'",$admin_uptime);
?>

【问题讨论】:

标签: php


【解决方案1】:

在 unix 中,每个进程都绑定父进程。如果父进程死了,子进程也会死。所以如果你使用这个命令:set_time_limit(20);你的脚本和执行的子进程被杀死。

【讨论】:

  • 我的脚本有不止一个 exec() 函数。我不会在 20 秒后杀死所有 exec()。我想给每个 exec() 20 秒的时间来完成它的执行。是否有可能在 20 秒后一个 exec() 停止,第二个 exec() 开始执行?
  • 分而治之:)
【解决方案2】:

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

【讨论】:

  • 这是我从您的帐户中注意到的第二项未注明出处的作品。这个答案copied this one 没有署名。复制另一篇文章很好,但将其归因于原作者是一种良好的做法(和良好的举止)。阅读更多about this here
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
相关资源
最近更新 更多