PHP的sleep()有什么实际用途?

时间:2010-10-14 06:46:16

标签: php function sleep usleep

我刚看了sleep()上的文档。

你会在哪里使用这个功能?

是否可以让CPU在昂贵的功能中中断?

任何常见的陷阱?

13 个答案:

答案 0 :(得分:47)

它可以使用的一个地方是创建延迟

假设您已经构建了一个使用curl / file_get_contents来获取远程网页的抓取工具。现在你不想在短时间内用太多的请求轰炸远程服务器。因此,您在连续请求之间引入延迟。

sleep以秒为单位获取参数,其朋友usleep以微秒为单位获取参数,在某些情况下更合适。

答案 1 :(得分:27)

另一个例子:您正在运行某种批量处理,这会大量使用资源。也许你正在走9,000,000本书籍的数据库,并更新其中约10%的书籍。这个过程必须在当天中午运行,但是有很多更新要做,运行批处理程序会将数据库服务器拖到其他用户的爬行中。

因此,您修改批处理以提交1000个更新,然后sleep提交5秒,以便数据库服务器有机会完成处理已备份的其他用户的任何请求。

答案 2 :(得分:23)

以下是我在其中一个项目中使用sleep的摘要:

foreach($addresses as $address)
{
  $url = "http://maps.google.com/maps/geo?q={$address}&output=json...etc...";
  $result = file_get_contents($url);
  $geo = json_decode($result, TRUE);

  // Do stuff with $geo

  sleep(1);
}

在这种情况下,sleep可以帮助我防止被Google地图屏蔽,因为我向服务器发送了太多请求。

答案 3 :(得分:9)

老问题我知道,但使用u / sleep的另一个原因可能是您编写安全/加密代码时,例如身份验证脚本。几个例子:

  1. 您可能希望通过使登录脚本有目的地减慢速度来降低潜在暴力攻击的有效性,尤其是在几次尝试失败后。
  2. 此外,您可能希望在加密期间添加人工延迟以缓解timing attacks。我知道你很可能会用像PHP这样的语言编写如此深入的加密代码,但我认为这仍然有效。
  3. 修改

    使用u / sleep来防止计时攻击不是一个好方法。您仍然可以在定时攻击中获取重要数据,您只需要更多样本来过滤掉您/睡眠中添加的噪音。

    您可以在Could a random sleep prevent timing attacks?

    中找到有关此主题的更多信息

答案 4 :(得分:1)

您可以使用sleep来暂停脚本执行...例如,延迟服务器端的 AJAX 调用或实现观察者。您也可以使用它来模拟延迟。

我也用它来延迟sendmail()&合。

有人使用use sleep()来防止DoS和登录brutefoces,我不同意'因此你需要添加一些检查以防止用户多次运行。

同时检查usleep

答案 5 :(得分:1)

我最近在使用Google的Geolocation API时不得不使用它。循环中的每个地址都需要调用Google的服务器,因此需要一些时间来接收响应。我使用usleep(500000)为所有事情提供了足够的时间。

答案 6 :(得分:1)

我通常不会将它用于提供网页,但它对命令行脚本很有用。

$ready = false;
do {
  $ready = some_monitor_function();
  sleep(2);
} while (!$ready);

答案 7 :(得分:1)

超级老帖,但我想我也会发表评论。 我最近不得不检查一个非常长的运行过程,创建了一些文件。所以我创建了一个迭代cURL函数的函数。如果我正在寻找的文件不存在,我会睡眠php文件,然后再检查一下:

function remoteFileExists() {
    $curl = curl_init('domain.com/file.ext');

    //don't fetch the actual page, you only want to check the connection is ok
    curl_setopt($curl, CURLOPT_NOBODY, true);

    //do request
    $result = curl_exec($curl);

    //if request did not fail
    if ($result !== false) {
        //if request was ok, check response code
        $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

        if ($statusCode == 404) {
              sleep(7);
              remoteFileExists();
        }
        else{
            echo 'exists'; 
        }
    }

    curl_close($curl);

}

echo remoteFileExists();

答案 8 :(得分:1)

使用它的另一种方法:如果你想每分钟更频繁地执行一次cronjob。我使用以下代码:

sleep(30);
include 'cronjob.php';

我每分钟都会调用此文件和cronjob.php。

答案 9 :(得分:1)

这有点奇怪......文件传输限制。

在我们很久以前运行的文件传输服务中,文件是从10Mbps上行链路服务器提供的。为了防止网络陷入困境,下载脚本会跟踪一次下载的用户数,然后计算每个用户每秒可以发送的字节数。它会发送一部分这个数量,然后睡一会儿(我认为1/4秒)然后发送更多......等等。

通过这种方式,服务器以大约9.5Mbps的速度连续运行,没有上行链路饱和问题......并且总是动态调整下载速度。

我不会这样做,或者用PHP,现在......但它当时效果很好。

答案 10 :(得分:0)

其中一个应用是,如果我通过脚本向100多个客户发送邮件,那么这个操作最多需要1-2秒,因此大多数网站如hotmail和yahoo都认为它是垃圾邮件,所以为了避免这种情况,需要在每封邮件后使用一些延迟执行。

答案 11 :(得分:0)

其他:您正在测试一个发出异步请求的Web应用程序(AJAX调用,延迟图像加载......)

您正在本地测试它,因此只有一个用户(您)并且没有网络延迟,因此响应很快。

使用sleep可以查看/测试加载和网络导致请求延迟时Web应用的行为。

答案 12 :(得分:0)

一个快速伪代码示例,您可能不想为单个事件获取数百万个警报电子邮件,但您希望脚本继续运行。

Coordinate