PHP的SESSION导致长连接阻塞

本文探讨了一种使用PHP开发的即时聊天程序中遇到的页面刷新阻塞问题。问题的根源在于长连接轮询机制结合PHP Session机制时产生的阻塞现象。文中详细解释了为何会发生阻塞,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

看来一定是哪里不对。

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值