睡眠时间是不是计入执行时间限制?

Posted

技术标签:

【中文标题】睡眠时间是不是计入执行时间限制?【英文标题】:Does sleep time count for execution time limit?睡眠时间是否计入执行时间限制? 【发布时间】:2010-10-18 23:07:53 【问题描述】:

我有两个关于 php 中的 sleep() 函数的问题:

    睡眠时间会影响我的 PHP 脚本的最大执行时间限制吗?有时,PHP 会显示消息“超过 30 秒的最大执行时间”。如果我使用sleep(31),会出现此消息吗?

    使用sleep()函数有什么风险吗?会不会耗费大量 CPU 性能?

【问题讨论】:

我猜它确实可以......为什么你的 PHP 中需要 sleep()?只是想知道...请说更多 原因:我只能每5分钟运行一次cronjobs。所以我想我可以使用 ... $waittime = mt_rand(0, 290);睡眠($等待时间); ...并同时执行代码 4 次。所以我应该在 4 个不同的时间点有一个 cron。 我启动了一些睡眠时间超过 100 秒的脚本。现在我的网站不再加载了。可能服务器只能同时运行 x 个脚本,并且有 x 个脚本处于休眠状态。这是真的吗? @marco92w 您的主机可能限制了您可以使用的资源数量,他们可能会计算线程中的资源。 【参考方案1】:

您应该尝试一下,只要脚本的休眠时间超过您的最大执行时间即可。

<?php
  sleep(ini_get('max_execution_time') + 10);
?>

剧透:Under Linux, sleeping time is ignored, but under Windows, it counts as execution time.

【讨论】:

你其实可以接受他的回答,为社区做一份服务。 我喜欢看到极其简单的答案,它们在说明方面比巨大的段落做得更好。也喜欢剧透! 我认为你的这个答案是一个很好的例子,为什么人们不应该简单地尝试代码 sn-p 而是询问。【参考方案2】:

它只影响脚本时间而不是像 sleep() 这样的系统调用。显然存在一个错误,其中包含 Windows sleep() 。最大执行时间是实时的,而不是 CPU 时间或类似的东西。但是,您可以更改它:

max_execution_time php.ini 中的指令。这是一个全局设置; 将ini_set() 与上述指令一起使用。这将仅为当前执行的脚本更改它,仅针对该执行; set_time_limit():也是局部变化。

至于最后两者的区别,我相信max_execution_time是一个固定的量。运行:

ini_set('max_execution_time', 60);

将脚本限制为 60 秒。如果您在 20 秒后拨打电话:

set_time_limit(60);

脚本现在将被限制为 20 + 60 = 80 秒。

【讨论】:

??有 6 个答案大致相同,而我的答案被否决了?这是如何运作的?以上有什么问题? 可能是因为您在投票后将答案更改为正确。 底部没有编辑时间,他怎么改? 我不知道为什么它被否决了。我是提问者,你很好地回答了我的问题。谢谢! @Calvin:如果你没有注意到,他们会在几周(或几天)内更改它,以提供更大的宽限期,以消除编辑历史记录。【参考方案3】:

来自PHP sleep() page,这是用户提供的注释:

注意:set_time_limit() 函数 和配置指令 max_execution_time 只影响 脚本本身的执行时间。 花在活动上的任何时间 发生在执行之外 脚本,例如系统调用使用 系统(),睡眠()函数, 不包括数据库查询等 当确定最长时间 脚本一直在运行。

【讨论】:

补充一点,这种行为仅在 *nix 上表现出来。在 Windows 上 set_time_limit() 每次都会获胜。【参考方案4】:

其他人已经介绍了 sleep() 和 PHP 脚本执行时间限制的基础知识,但您还应该注意使用非常长的睡眠时间时的另一个风险。

通常,当浏览器向服务器发送请求并且没有从服务器接收任何数据时,连接可能会超时。这个时间限制取决于浏览器的配置,但我读过 IE7 的默认值只有 30 秒,而Firefox has a default value of 115 seconds--你可以在 Firefox 中检查自己的配置,方法是转到 about:config 并过滤 network.http.keep-alive.timeout(时间限制以秒为单位)。

编辑:我把 network.http.keep-alive.timeout 和 browser.urlbar.search.timeout 的单位搞混了。确实是秒,而不是十分之一秒。

【讨论】:

谢谢,我以前不知道。我认为限制必须在 1/1 秒内指定,因为 about:config 中的值是 30。;) 啊,你是对的。以秒为单位。但默认值应该是 300 秒,而不是 30 秒,所以您的设置可能被浏览器扩展更改了。【参考方案5】:

a) 是的,它计入时间限制(所以 sleep(31) 会触发错误)

b) 它与消耗 CPU 性能相反 - 它允许其他应用程序使用 CPU(当应用程序休眠时,该应用程序的 CPU 使用率将接近 0%)。除了从用户身上抽出时间之外,我真的想不出使用它的任何风险。

【讨论】:

以上是关于睡眠时间是不是计入执行时间限制?的主要内容,如果未能解决你的问题,请参考以下文章

继承的方法是不是计入 Android 中的 Dex 方法限制?

JavaScript 中是不是有睡眠/暂停/等待功能? [复制]

Socket.io 睡眠一些客户端

我可以使用等待而不是睡眠吗? [复制]

在Java中,是不是可以将方法执行一段时间并在达到时间限制后停止?

在 Process.StandardOutput.Read() 方法之前是不是需要睡眠?