php 多个ajax 请求,同一页面多个ajax 请求出现貌似js阻塞的现象解决方案

在一个项目中使用php调用pcntl模块实现多进程并发队列任务并通过jquery异步获取后台执行结果,但是在前台ajax轮询后台结果的时候出现阻塞,如图所示:

201308111376210020_0.jpg

201308111376210020_1.jpg

第一个请求是用来启动后台多任务进程deamon的ajax请求,这个请求由于调用pcntl派生子进程执行任务,故这个ajax请求会长时间处于等待响应的状态,后面的请求是每隔400毫秒请求一次后台查找结果。如图一所示,第一个请求发送后,后面的请求一直处于阻塞状态,导致setInterval轮询的请求全部被hold住。当第一个请求任务全部执行完毕后,后面的请求基本在统一时刻去后台拉取结果,这个时候每个请求返回的结果是一摸一样的,也就是说轮询已经不存在实际意义。

在网上找了一些说法,肯定了jQuery是具有非常强大异步并发处理能力,同时也排除了浏览器导致阻塞的可能。从一些文章中找到一种说法是有可能session在使用session file的时候会lock住,导致多个请求会等待第一个请求结束使session file释放,并给出了使用session_write_close函数解决锁文件的问题。

PHP官方文档是有如下解释:

void session_write_close ( void )

End the current session and store session data.

Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time. When using framesets together with sessions you will experience the frames loading one by one due to this locking. You can reduce the time needed to load all the frames by ending the session as soon as all changes to session variables are done.

在请求的队列逻辑前面加上session_write_close()函数,将session立即写入session file,释放文件,而不是php script执行完毕再写入file,再释放,这样可以避免file长时间锁住,而导致后面请求的逻辑不能读取session file。

改造后的效果非常明显,轮询结果恢复正常:

201308111376210020_2.jpg

本文地址:http://www.it300.com/article-15292.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 当一个页面上同时开启多个ajax请求向后台请求数据时,如果没有特殊处理,这些请求会被堵塞,变成一个一个地完成。这是因为这些请求属于同一个会话,而同一个会话中的请求会受到Session锁的影响,导致请求阻塞。\[1\]为了避免这种情况,可以在控制器上加上特性\[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)\],这样可以将Session设置为只读,避免同一会话中的Session锁导致请求阻塞。\[2\]另外,需要注意的是,HttpSessionState来自于HttpModule的SessionStateModule,在每次请求处理过程中,会检查当前请求的处理程序是否实现了接口IRequiresSessionState,如果实现的话,会为这个请求分配HttpSessionState。同时,SessionStateModule还负责SessionID的生成、Cookieless会话管理、从外部状态提供程序中检索会话数据以及将数据绑定到请求的调用上下文。如果页面请求设置了读取器锁定,同一会话中同时处理的其他请求将无法更新会话状态,但至少可以进行读取。如果页面请求设置了写入锁定,那么所有其他页面都会被阻止,无论他们是要读取还是写入内容。在AJAX程序设计中,需要注意这种情况的发生。\[3\] #### 引用[.reference_title] - *1* *2* *3* [同一页面多个ajax请求后台堵塞问题](https://blog.csdn.net/leftfist/article/details/82805674)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值