我在 VMWare 中的 Linux 上运行 Apache。
我请求的 PHP 页面之一是sleep()
,我发现如果我在第一页是 时尝试请求第二页sleep()'ing
,第二页会挂起,等待sleep()
第一页的完成。
有没有其他人看到过这种行为?
我知道PHP不是多线程的,但这似乎是对 CPU 的严重错误处理。
编辑:我应该提到 CPU 使用率不会飙升。我所说的 CPU“占用”的意思是,当页面处于 sleep() 状态时,似乎没有其他 PHP 页面能够使用 CPU。
我在 VMWare 中的 Linux 上运行 Apache。
我请求的 PHP 页面之一是sleep()
,我发现如果我在第一页是 时尝试请求第二页sleep()'ing
,第二页会挂起,等待sleep()
第一页的完成。
有没有其他人看到过这种行为?
我知道PHP不是多线程的,但这似乎是对 CPU 的严重错误处理。
编辑:我应该提到 CPU 使用率不会飙升。我所说的 CPU“占用”的意思是,当页面处于 sleep() 状态时,似乎没有其他 PHP 页面能够使用 CPU。
可能是被调用的页面打开了一个会话,然后没有提交它,在这种情况下,请参阅此答案以获得解决方案。
这可能意味着您的 Apache 仅使用 1 个子进程。
所以:
1 个子进程正在处理一个请求(在这种情况下处于休眠状态,但它可能正在做真正的工作,Apache 无法区分),因此当一个新请求到来时,它必须等到第一个进程完成。
解决方案是增加允许 Apache 生成的子进程的数量(如果您使用的是 prefork MPM,则为MaxClients指令),只需从 PHP 脚本中删除 sleep() 即可。
如果不确切知道脚本中发生了什么,很难说,但您可能可以摆脱 sleep()。
您实际上是看到 CPU 达到 100% 还是只是没有提供其他页面?您正在运行多少个 apache 实例?当您在线程中运行 sleep() 时,它们是否都停止了?
PHP 的 sleep() 函数本质上是通过一个空闲循环运行 n 秒。它不会释放任何内存,但不会显着增加 CPU 负载。