sleep()默默地占用CPU

时间:2020-03-05 18:41:49  来源:igfitidea点击:

我正在VMWare中的Linux上运行Apache。

我要请求的一个PHP页面执行了" sleep()",我发现如果在第一页面处于" sleep()"状态时尝试请求第二个页面,则第二个页面将挂起,等待从第一页开始的" sleep()"。

还有其他人看到过这种行为吗?

我知道PHP不是多线程的,但是这似乎对CPU的处理不当。

编辑:我应该提到CPU使用率不会峰值。我所说的CPU"跳动"的意思是,当页面处于sleep()时,似乎没有其他PHP页面可以使用CPU。

解决方案

回答

我们实际上是在看到CPU达到100%的运行速度,还是只是没有其他页面在运行?我们正在运行多少个apache实例?当我们在其中一个线程中运行sleep()时,它们都停止了吗?

PHP的sleep()函数实际上在空闲循环中运行了n秒。它不会释放任何内存,但不会显着增加CPU负载。

回答

这可能意味着Apache仅使用1个子进程。

所以:

1个子进程正在处理一个请求(在本例中为休眠状态,但它可能正在执行实际工作,Apache无法区分两者之间的区别),因此,当一个新请求到达时,它将不得不等到第一个进程完成。

解决方案是增加允许Apache生成的子进程的数量(如果使用的是Prefork MPM,则可以使用MaxClients指令),只需从PHP脚本中删除sleep()即可。

如果不完全知道脚本中发生了什么,很难说,但是我们可能会摆脱sleep()。

回答

可能是被调用页面打开了一个会话,然后不提交它,在这种情况下,请参见此答案以获取解决方案。