我在我的服务器上使用php 5.2.11 + php-fpm + nginx。 如果用户发送耗时的请求“A”,则在从服务器获得“A”响应之前,他会发送更多其他正常请求。 奇怪的是,在回复“A”的响应之前,用户无法获得任何响应,似乎php-fpm将请求排队。 我检查了tcp连接,请求是从不同的socket发送的,有相同的PHPSESSION。在服务器端,php-fpm还将正常请求写入慢速日志。
我无法弄清楚如何解决它,有什么建议吗?
答案 0 :(得分:4)
这不是PHP-FPM错误。因为你说他们有相同的会话,那就是罪魁祸首。 PHP中的会话具有每会话锁定,因此一个用户无法加载具有特定会话ID的页面,而存在具有相同会话的未完成请求;当你拨打session_start()
时会发生阻止。这是为了避免编辑相同会话变量的不同请求(导致所有类型的问题)。当请求结束并将其生成的会话数据写入存储时,下一个可以开始。
如果您希望能够读取会话变量并开始耗时的工作,但又不想阻止其他请求发生,请在阅读需要继续的会话数据后使用session_write_close()
。请注意,在调用之后您无法修改会话数据(也许您无法阅读它,因为$_SESSION
已清空,但无法记住)。