关于 php:sleep() 默默地占用 CPU

关于 php:sleep() 默默地占用 CPU

sleep() silently hogs CPU

我在 VMWare 中的 Linux 上运行 Apache。

我请求的一个 PHP 页面执行 sleep(),我发现如果我在第一页为 sleep()'ing 时尝试请求第二个页面,则第二个页面挂起,等待 sleep()从第一页到结束。

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

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

编辑:我应该提到 CPU 使用率不会飙升。我所说的 CPU"占用"的意思是,当页面处于 sleep()'ing 状态时,似乎没有其他 PHP 页面能够使用 CPU。


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


这可能意味着您的 Apache 只使用了 1 个子进程。

因此:

第一个子进程正在处理一个请求(在这种情况下处于hibernate状态但它可能正在做真正的工作,Apache 无法区分),所以当一个新请求到来时,它必须等到第一个过程完成。

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

如果不确切知道脚本中发生了什么,很难说,但您可能可以摆脱 sleep()。


您是否真的看到 CPU 达到 100% 或者只是没有其他页面正在服务?您正在运行多少个 apache 实例?当您在线程中运行 sleep() 时,它们是否都停止了?

PHP 的 sleep() 函数本质上是通过一个空闲循环运行 n 秒。它不会释放任何内存,但不会显着增加 CPU 负载。


推荐阅读