它找到应用的其中一个场景是创建一个延迟。
假设您已经构建了一个使用curl
/file_get_contents
获取远程页面的爬虫。现在,您不希望在短时间内向远程服务器发送太多请求。因此,您在连续请求之间引入了一个延迟。
sleep
接受以秒为单位的参数,它的朋友usleep
接受以微秒为单位的参数,在某些情况下更加适合。
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地图阻塞,因为我向服务器发送了太多的请求。
虽然这是一个老问题,但使用 u/sleep 的另一个原因可能是在编写安全/加密代码时,例如身份验证脚本。以下是一些例子:
编辑
使用 u/sleep 对抗时间攻击并不是一个好的解决方案。在时间攻击中,您仍然可以获取重要数据,只需要更多的样本来滤除 u/sleep 添加的噪声。
您可以在 随机睡眠可以防止时间攻击吗? 中找到有关此主题的更多信息。
另一种使用方法:如果您想更频繁地执行cronjob,甚至每分钟执行一次。我使用以下代码:
sleep(30);
include 'cronjob.php';
$ready = false;
do {
$ready = some_monitor_function();
sleep(2);
} while (!$ready);
这篇文章发表已经很久了,但我仍会进行评论。 最近我不得不检查一个非常长时间运行的进程,该进程创建了一些文件。因此,我编写了一个函数来遍历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();
您可以使用sleep来暂停脚本执行...例如延迟服务器端的AJAX调用或实现观察者。您还可以使用它来模拟延迟。
我也使用它来延迟sendmail()和其他操作。
有些人使用sleep()来防止DoS和登录暴力破解,但我不同意,因为您需要添加一些检查来防止用户多次运行。
还请查看usleep。
usleep(500000)
来给所有相关的东西足够的时间。
sleep
来确保文件完全上传。如果没有它,脚本将会失败。 - Vahid Amiri