代码之家  ›  专栏  ›  技术社区  ›  alex

php的sleep()的实际用途是什么?

  •  48
  • alex  · 技术社区  · 15 年前

    我刚刚看了一下 sleep() .

    在哪里使用这个函数?

    有没有给CPU一个昂贵功能的中断?

    有什么常见的陷阱吗?

    13 回复  |  直到 7 年前
        1
  •  47
  •   codaddict    15 年前

    有一个地方可以利用它来创建一个 延迟 .

    假设你建造了一个使用 curl / file_get_contents 获取远程页面。现在,您不想在短时间内用太多的请求轰炸远程服务器。所以在连续的请求之间引入一个延迟。

    sleep 几秒钟后开始辩论,它的朋友 usleep 以微秒为单位接受参数,在某些情况下更适合。

        2
  •  27
  •   Andy Lester    15 年前

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

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

        3
  •  23
  •   Script47    7 年前

    以下是我使用方法的一个片段 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);
    }
    

    在这种情况下 睡觉 帮助我避免被谷歌地图阻止,因为我向服务器发送了太多的请求。

        4
  •  9
  •   Alberto de Areba Angry Dan    8 年前

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

    1. 您可能希望通过故意使登录脚本变慢,特别是在几次失败的尝试之后,降低潜在的暴力攻击的有效性。
    2. 另外,您可能希望在加密期间添加一个人工延迟,以减轻 timing attacks . 我知道,用类似php的语言编写如此深入的加密代码的可能性很小,但我认为仍然有效。

    编辑

    针对定时攻击使用u/sleep不是一个好的解决方案。你仍然可以在定时攻击中获得重要的数据,你只需要更多的样本来过滤掉u/sleep增加的噪声。

    有关此主题的详细信息,请参阅: Could a random sleep prevent timing attacks?

        5
  •  1
  •   Fabio Mora    15 年前

    可以使用sleep暂停脚本执行…例如,延迟 阿贾克斯 由服务器端调用或实现观察器。您还可以使用它来模拟延迟。

    我还使用它来延迟sendmail()公司。

    有人使用use sleep()来防止DOS和登录brutefoces,我不同意,因为在这里,您需要添加一些检查来防止用户多次运行。

    也检查 usleep .

        6
  •  1
  •   hohner    14 年前

    我最近在使用谷歌的地理定位API时不得不使用它。循环中的每个地址都需要调用Google的服务器,因此需要一点时间来接收响应。我用过 usleep(500000) 给每件事足够的时间。

        7
  •  1
  •   Octopus    13 年前

    我通常不会使用它来服务网页,但它对命令行脚本很有用。

    $ready = false;
    do {
      $ready = some_monitor_function();
      sleep(2);
    } while (!$ready);
    
        8
  •  1
  •   David    12 年前

    超老的帖子,但我想我也会评论。 我最近不得不检查一个非常长时间运行的进程,它创建了一些文件。所以我做了一个循环函数。如果我要查找的文件不存在,我将休眠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();
    
        9
  •  1
  •   Tom    9 年前

    另一种使用它的方法是:如果你想每分钟在那里更频繁地执行一个cronjob。我对此使用以下代码:

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

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

        10
  •  1
  •   XediDC    9 年前

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

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

    通过这种方式,服务器以大约9.5Mbps的速度连续运行,而不存在上行链路饱和问题……并且始终动态调整下载速度。

    我现在不会这样做,也不会用PHP来做……但当时效果很好。

        11
  •  0
  •   HARISH THAKUR    11 年前

    它的一个应用程序是,如果我通过脚本向100多个客户发送邮件,那么此操作最多需要1-2秒,因此大多数网站(如hotmail和yahoo)都将其视为垃圾邮件,因此为了避免这种情况,我们需要在每次发送邮件后使用一些延迟。

        12
  •  0
  •   Paolo    9 年前

    其中包括:您正在测试一个Web应用程序,该应用程序发出Ayncronous请求(Ajax调用、懒惰的图像加载…)

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

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

        13
  •  0
  •   Mike Q    9 年前

    一个快速的伪代码示例,说明您可能不希望在单个事件中收到数百万封警报电子邮件,但您希望脚本继续运行。

      if CheckSystemCPU() > 95  
            SendMeAnEmail()
            sleep(1800)
      fi
    
    推荐文章