【问题标题】:What is a practical use for PHP's sleep()?PHP 的 sleep() 有什么实际用途?
【发布时间】:2011-04-25 05:59:21
【问题描述】:

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

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

是否可以让 CPU 在昂贵的功能中休息一下?

有什么常见的陷阱吗?

【问题讨论】:

    标签: php function sleep usleep


    【解决方案1】:

    这是我如何在我的一个项目中使用 sleep 的 sn-p:

    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 帮助我防止被谷歌地图阻止,因为我向服务器发送了太多请求。

    【讨论】:

      【解决方案2】:

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

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

      编辑

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

      您可以在以下网址找到有关此主题的更多信息:Could a random sleep prevent timing attacks?

      【讨论】:

      • 这不是防止此类攻击的最佳做法。它会导致您的脚本继续执行,占用内存和资源。最好在应用程序中实现客户端延迟,然后自动关闭任何不尊重延迟的请求。服务器端延迟为 DOS 攻击提供了一个简单的载体。人为延迟也不是防止时序攻击的最佳实践:使用时序安全比较函数更安全,并且通常使用更少的资源。
      • Re:定时攻击请参阅 ircmaxell 在您链接到的关于随机睡眠以防止定时攻击的页面上给出的答案,它详细解释了我对这些攻击的观点。
      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        另一种使用方式:如果您想每分钟更频繁地执行一次 cronjob。为此,我使用以下代码:

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

        我调用这个文件,每分钟调用一次 cronjob.php。

        【讨论】:

          【解决方案5】:

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

            if CheckSystemCPU() > 95  
                  SendMeAnEmail()
                  sleep(1800)
            fi
          

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

                超级老帖子,但我想我也会发表评论。 我最近不得不检查一个运行时间很长的进程,它创建了一些文件。所以我制作了一个迭代 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();
                

                【讨论】:

                  【解决方案9】:

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

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

                  【讨论】:

                    【解决方案10】:

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

                    【讨论】:

                      【解决方案11】:

                      另一个示例:您正在运行某种大量使用资源的批处理过程。也许您正在浏览包含 9,000,000 本书的数据库并更新其中大约 10%。该过程必须在中午运行,但要完成的更新太多,运行批处理程序会将数据库服务器拖到其他用户的爬网中。

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

                      【讨论】:

                        【解决方案12】:

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

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

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

                        还要检查usleep

                        【讨论】:

                          【解决方案13】:

                          一个有用的地方是创建一个延迟

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

                          sleep 以秒为单位接受参数,它的朋友usleep 以微秒为单位接受参数,在某些情况下更合适。

                          【讨论】:

                          • 我唯一能想到的也是,除非将 php 用于其他事情,而不是将其放在网络服务器上。
                          • 更一般地说:请求限制,传入和传出。
                          • 我在上传文件到服务器后使用sleep来保证文件上传完整。没有它,脚本就会失败。
                          • sleep 返回 0 以检查是否成功,但 usleep 不告诉任何内容。只是想包括它!在你使用任何东西之前xD
                          猜你喜欢
                          • 2011-05-06
                          • 2018-08-07
                          • 2011-04-02
                          • 2019-05-17
                          • 2015-04-22
                          • 2021-07-22
                          • 1970-01-01
                          • 2011-09-20
                          • 2015-06-07
                          相关资源
                          最近更新 更多