php - PHP while true 循环,sleep() 函数最短时间
问题描述
我有一个php函数
<?php
while(true){
sleep(2);
echo 1;
}
?>
请问:是kill server吗?
解决方案
这个问题有两种可能的答案...
第一的
如果你的意思是一个进程本身会占用服务器资源,那么答案是否定的,因为sleep
系统调用 [1](在 linux 实现上)会从 CPU 中删除进程并仅在系统中断后恢复它超时时间已过时由调度程序触发。因此,只要它处于睡眠状态,该进程实际上就不再消耗 CPU 周期(即不使用服务器资源)。在 CLI SAPI 中,这在某些情况下可能很好,甚至是可取的,因为您通常可以完全控制何时可以运行此脚本以及一次运行多少个脚本。
第二
但是,如果您处于面向 Web 的环境中(即这个 php 脚本是通过对您的 Web 服务器的 HTTP 请求启动的),那么您必须考虑这样一个事实,即您可以使用的 Web 工作者数量是有限的。如果请求发起 30 次,而您只有 30 个工作人员可用,那么您现在所有工作人员都被无限捆绑,用户无法再向您的 Web 服务器发出任何请求。所以从这个意义上说,您实际上已经使服务器资源紧张。
while(true)
所以每当你有一个循环时要非常小心。问问自己,这真的有必要吗?大多数时候不是。
注意
顺便说一句,同样重要的是要了解在外部流中花费的时间(其中包括睡眠)不计入您的max_execution_time
. 因此,睡眠中花费的 2 秒不算在内,但每次进程再次唤醒时,该时间都会累加。所以是的,max_execution_time
如果您希望进程在该循环内继续无限运行,则设置为 0 很重要。在 CLI 解释器中,默认值为 0,但在大多数 Web SAPI 中,它的默认值为 30 秒,因为您通常不希望任何面向 Web 的请求占用您的工作人员那么长时间。
推荐阅读
- javascript - 如何检查最近用jquery悬停的元素
- git - 错误:将“.git”转换为绝对错误:访问被拒绝
- scala - Scala:Nothing 和 throw 表达式
- c# - 如何从另一个脚本获取游戏对象位置
- python - 如何并行化这个耗时的循环
- c++ - 如何使用 C++ 客户端 librdkafka 以编程方式在 Apache Kafka 中创建主题
- c - 在线程中调用 pthread_cond_wait 是否会解锁互斥锁
- sql - SQL Server 2016:有连接和无连接的查询性能
- javascript - 如何按名称和列表过滤vue中的数组
- css - 如何为 SVG 添加阴影
?