PHP的SESSION导致长连接阻塞

最近在开发一个网页版的即时聊天程序,后端采用的PHP。程序会定时轮训服务器,查询有没有新的消息。轮询采用的是长连接。

然而遇到一个很奇怪的现象,每次刷新页面总是阻塞很久,一开始考虑难道是服务器的问题?可我是在本地测试的,应该不可能是性能瓶颈。然后反复刷新发现了一个规律:

每次刷新阻塞的时间刚好和轮询长连接超时时间一致。

总结:是轮询时,此链接阻塞了相同的域名的链接。浏览器会等到此链接技术后,才继续加载下一个链接。所以刷新操作也被延后了。

虽然知道如此,可是 why?如果阻塞是必然的话,那么一个网页加载时那么多请求并没有相互阻塞啊!

看来一定是哪里不对。

最后各种Baidu---原来是万恶的SESSION!

php的session缺省用文件存储,当请求一个需要操作session的php文件(session_start())时,这个文件是会被第一个操作session的进程锁定,导致其他请求阻塞。其他请求会挂起在session_start()直到session文件解锁。

所以,才造成了请求被阻塞。
那么解决方案也也就出来了,如果长连接的页面只需要查询SESSION而需要设置,那么久打开后直接关闭SESSION的写模式。文件就会被解锁:
<?php
session_start();
session_write_close();
这个是测试有效的。
当然还有一个解决方案,那就是将php的session改为数据库存储。不过这种我并未测试,因此不贴代码了。

猜你喜欢

转载自blog.csdn.net/qq_28347599/article/details/77916828