什么是PHP的睡眠()的实际用途?
我只看了sleep()
文档sleep()
。
你会在哪里使用这个function?
是否有一个昂贵的function让CPUrest?
任何常见的陷阱?
一个地方,它发现使用是创造一个延迟 。
比方说,你已经build立了一个使用curl
/ file_get_contents
获取远程页面的爬虫。 现在你不想在短时间内用太多的请求来轰炸远程服务器。 所以你在连续的请求之间引入一个延迟。
sleep
在几秒钟内就能获得参数,它的朋友在几秒钟内接受参数,在某些情况下更适合。
另一个例子:你正在运行某种批量处理,大量使用资源。 也许你正在走900万本书名的数据库,并更新其中约10%。 这个过程必须在一天中间运行,但是有太多的更新要做,以至于运行你的批处理程序会把数据库服务器拖拽到其他用户的抓取中。
因此,您修改批处理过程以提交1000个更新,然后sleep
5秒钟,以便数据库服务器有机会完成处理其他已备份用户的任何请求。
下面是我在一个项目中使用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地图阻止,因为我向服务器发送的请求过多。
编辑:这是codaddict正在说的一个例子。
老问题我知道,但使用你/睡眠的另一个原因可能是当你正在编写安全/encryption代码,如validation脚本。 几个例子:
- 您可能希望通过使您的login脚本有目的的缓慢,特别是在一些失败的尝试后,减less潜在的暴力攻击的有效性。
- 另外,您可能希望在encryption过程中添加一个仿真延迟来缓解计时攻击 。 我知道,你将会用像PHP这样的语言编写这样深入的encryption代码的机会是渺茫的,但我仍然认为它是有效的。
你可以使用sleep来暂停脚本的执行…例如延迟服务器端的AJAX调用或实现一个观察者。 你也可以用它来模拟延迟。
我也用这个来延迟sendmail()&co。 。
有人使用睡眠(),以防止DoS和loginbrutefoces,我不同意因为你需要添加一些检查,以防止用户多次运行。
检查还睡着了 。
我最近在使用Google的Geolocation API时不得不使用它。 每个循环中的地址都需要调用Google的服务器,因此需要一些时间来接收响应。 我用了usleep(500000)
让一切都有足够的时间。
我通常不会使用它来提供网页,但对命令行脚本很有用。
$ready = false; do { $ready = some_monitor_function(); sleep(2); } while (!$ready);
超级老post,但我想我也会评论。 我最近不得不检查一个非常长的运行过程,创build一些文件。 所以我做了一个迭代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();
它的一个应用是,如果我通过脚本向100多个客户发送邮件,那么这个操作将花费最多1-2秒,因此大多数网站,如Hotmail和雅虎认为它是垃圾邮件,所以为了避免这个,我们需要使用在每封邮件后执行一些延迟。
其他:你正在testing一个Web应用程序,使asynchronous请求(AJAX调用,懒惰的图像加载,…)
您正在本地进行testing,因此只有一个用户(您)并且没有networking延迟,所以响应是即时的。
使用sleep
可以让您查看/testingWeb应用程序在加载和networking延迟请求时的行为。
一个快速的伪代码示例,您可能不想为单个事件获取数百万条警报邮件,但希望脚本继续运行。
if CheckSystemCPU() > 95 SendMeAnEmail() sleep(1800) fi
这是一个奇怪的情况有点文件传输限制。
在很久以前我们运行的文件传输服务中,文件是从10Mbps上行链路服务器提供的。 为了防止networking陷入停滞状态,下载脚本会跟踪一次下载了多less用户,然后计算每个用户每秒可以发送多less个字节。 它会发送这个数额的一部分,然后睡一会儿(我认为是1/4秒)然后发送更多…等等。
通过这种方式,服务器以9.5Mbps的速度连续运行,不会出现上行链路饱和问题,并且总是dynamic地调整下载速度。
我不会这样做,或者现在在PHP中,但是这个时候效果很好。
另一种使用方法:如果你想每隔一分钟就更频繁地执行一次cronjob。 我使用下面的代码:
sleep(30); include 'cronjob.php';
我把这个文件叫做cronjob.php,每分钟一个。