PHP的session阻塞机制带来的单页面多ajax请求阻塞的解决
2013-01-12 09:46
537 查看
遇到一个有意思的问题:
比如在一个页面中,有两个不同的ajax请求,分别在两个函数中调用去请求,前一个ajax是长轮询的请求。后一个ajax是每隔几秒执行一次,负责读取前一个ajax执行的日志,并把读到的日志内容显示在当前页面的某一个div中。
问题很简单,但意外发生了。
前面的ajax请求开始执行后,日志内容也正常不断的生成。但后一个ajax定时去取日志却总也取不到,看到的现象是没反应。直到第一个ajax请求执行结束,日志内容才一下子全部被读出,显示在div中,这显示不是想要的结果,想要的是在第一个ajax请求在执行过程中,就拿到执行日志并显示。
这个奇怪了,怎么会取不到呢?注释掉第二个方法中的Ajax的请求代码,直接写死一句话,然后刷新后再执行前一个Ajax请求后,观察到第二个注释后ajax请求后的函数正常工作,写死的的那句话也每几秒一次写入到结果div中。说明定时执行是正常工作的,但如果有Ajax请求就无法正常工作,那问题到底出在哪里?
打开firebug,观察发现,当前一个ajax请求在进行时,后面的定时请求也在不断生成,但是一直是等待状态,非要等到前一个ajax请求执行结束,后面的ajax请求才能成功请求!说明前一个ajax执行导致了阻塞影响到了后面的所有请求!
查阅相关PHP阻塞的资料,发现有人遇到过类似问题,是由于php的session阻塞机制导致的!
只要执行了session_start方法,就会创建session,我们知道,每个客户端在请求的时候,session是存储在文件中的。而且同一个客户端只会共用一个相同的session。一个请求占有了Session后,实际上是以读写方式打开了session文件。为了防止冲突,后面的请求只能等待。
在本例中,第一个长时间执行的ajax占有了session后,加了读写锁,后面的请求无法获得相同session文件的读写锁,故只能等待前一个请求释放session。
搞清楚了问题原因,解决就好解决了。
1)如果可以不用session_start,则不使用。有时候执行这个句往往是出于习惯或原来代码就这么写的,为什么不知道,呵呵。
2)无法避免使用session_start的,那也没关系,写完session内容后,及时关闭。关闭方法很简单。
session_write_close();
本例是第二种情况,这两个ajax请求都不需要读写session,于是执行在最前面加上了session_write_close();后问题解决。
比如在一个页面中,有两个不同的ajax请求,分别在两个函数中调用去请求,前一个ajax是长轮询的请求。后一个ajax是每隔几秒执行一次,负责读取前一个ajax执行的日志,并把读到的日志内容显示在当前页面的某一个div中。
问题很简单,但意外发生了。
前面的ajax请求开始执行后,日志内容也正常不断的生成。但后一个ajax定时去取日志却总也取不到,看到的现象是没反应。直到第一个ajax请求执行结束,日志内容才一下子全部被读出,显示在div中,这显示不是想要的结果,想要的是在第一个ajax请求在执行过程中,就拿到执行日志并显示。
这个奇怪了,怎么会取不到呢?注释掉第二个方法中的Ajax的请求代码,直接写死一句话,然后刷新后再执行前一个Ajax请求后,观察到第二个注释后ajax请求后的函数正常工作,写死的的那句话也每几秒一次写入到结果div中。说明定时执行是正常工作的,但如果有Ajax请求就无法正常工作,那问题到底出在哪里?
打开firebug,观察发现,当前一个ajax请求在进行时,后面的定时请求也在不断生成,但是一直是等待状态,非要等到前一个ajax请求执行结束,后面的ajax请求才能成功请求!说明前一个ajax执行导致了阻塞影响到了后面的所有请求!
查阅相关PHP阻塞的资料,发现有人遇到过类似问题,是由于php的session阻塞机制导致的!
只要执行了session_start方法,就会创建session,我们知道,每个客户端在请求的时候,session是存储在文件中的。而且同一个客户端只会共用一个相同的session。一个请求占有了Session后,实际上是以读写方式打开了session文件。为了防止冲突,后面的请求只能等待。
在本例中,第一个长时间执行的ajax占有了session后,加了读写锁,后面的请求无法获得相同session文件的读写锁,故只能等待前一个请求释放session。
搞清楚了问题原因,解决就好解决了。
1)如果可以不用session_start,则不使用。有时候执行这个句往往是出于习惯或原来代码就这么写的,为什么不知道,呵呵。
2)无法避免使用session_start的,那也没关系,写完session内容后,及时关闭。关闭方法很简单。
session_write_close();
本例是第二种情况,这两个ajax请求都不需要读写session,于是执行在最前面加上了session_write_close();后问题解决。
相关文章推荐
- PHP的Session阻塞机制带来的单页面多ajax请求阻塞的解决
- ajax请求php页面中生成的session,无法在其他普通php页面使用
- Ajax请求Session超时的解决办法:拦截器 + 封装jquery的post方法
- 定时请求php 后台 AJAX 请求,在页面中倒计时,和显示刷新时间
- php session跨页面传递 session值丢失问题之完美解决
- php session阻塞页面分析及优化 (session_write_close session_commit使用)
- 在ASP.NET中使用IHttpHandler处理请求(如自实现AJAX)时,无法获得Session(或者说是Session 为 null)的原因及解决方法
- php session阻塞页面分析及优化 (session_write_close session_commit使用)
- 重写ajax方法实现异步请求session过期时跳转登录页面
- asp.net session锁导致ajax请求阻塞
- PHP中Session引起的脚本阻塞问题解决办法
- PHP session文件独占锁引起阻塞问题解决方法
- 重写ajax方法实现异步请求session过期时跳转登录页面(转)
- Ajax同步请求出现浏览器页面假死,阻塞UI线程之解决方案
- 小程序request请求PHP服务器session失效的解决,header头部加cookie
- 前端使用Jquery的getJSON方法,后台使用PHP,解决IE和火狐Firefox中存在的跨域ajax请求问题。
- 处理jquery的ajax请求session过期跳转到登录页面
- 微信返回上一页,页面中的AJAX的请求,对Get请求无效的解决办法
- 记录问题:登录session过期,ajax请求被web security拦截,页面没有数据且没有重定向到login页面
- PHP中Session引起的脚本阻塞问题解决办法