我在服务器上使用php 5.2.11 + php-fpm + nginx。如果用户发送了一个耗时的请求"A",在收到服务器对"A“的响应之前,他会发送更多的正常请求。奇怪的是,在返回响应"A“之前,用户无法获得任何响应,似乎php-fpm会将请求排入队列。我检查了tcp连接,请求来自不同的socket,具有相同的PHPSESSION。在服务器端,php-fpm也将正常的请求写入慢日志。
我想不出该怎么解决,有什么建议吗?
发布于 2011-06-24 06:34:23
这不是PHP-FPM的错误。既然你说他们有相同的会话,那么这就是罪魁祸首。在PHP中,会话有一个每个会话的锁,所以当存在使用相同会话的未完成请求时,一个用户不能加载一个具有特定会话ID的页面;当您调用session_start()时,阻塞就会发生。这是为了避免不同的请求编辑相同的会话变量(这会导致各种问题)。当一个请求结束并将其结果会话数据写入存储区时,下一个请求就可以开始了。
如果您希望能够读取会话变量并启动一个耗时的作业,但又不想阻止其他请求的发生,那么只需在读取您需要继续的会话数据之后使用session_write_close()。注意,在调用之后,您不能修改会话数据(也许您无法读取它,因为$_SESSION是空的,但是无法记住)。
https://stackoverflow.com/questions/3616463
复制相似问题