现在我们开发了很多依赖于Ajax请求的应用,在某些情况下,甚至全部页面都依赖Ajax。有时我们会注意到,当一个网页发送两个或者更多Ajax请求时,PHP的反应时间会很长并会同时返回响应内容。

这个问题很可能是你处理PHP会话的方式造成的,跟着本文去理解这个问题,并做一些处理来避免这个问题。

内容

什么是PHP会话?
什么是Ajax?
具体问题
造成的原因
问题的解决方法
总结

什么是PHP会话?

为了理解这个问题,有必要先了解一下PHP会话和Ajax,以及它们是怎么干扰的。
假设你正在开发一个Web应用,想要识别不同用户。你想要记住是谁每次浏览了所有页面但都没有登录,这种情况下,你可以使用cookies或sessions。
可以你已经意识到了,sessions是一种存储用户信息的方式,它可以在任何页面重新取回用户信息。跟Cookies不同,Sessions是存储在服务器上的,所有用户不能直接改变这些信息。
默认情况下,Sessions在用户关闭浏览器之前均有效,或者用户在PHP配置文件中指定的时间内没有活动之后才失效。
在PHP页面中,无论你什么时候想要存储或者重新获取用户数据,都必须在页面开始处调用session_start(),因此才有权限使用$_SESSION去获取session数据。

什么是Ajax?

Ajax代表 Asynchronous JavaScript and XML,它是一种不用重新加载整个页面就能向服务器发送数据和从服务器接收数据的方式。
我们使用这种方式来发送数据,并以较快的速度从服务器检索数据。我们不用得到整个页面并在浏览器中渲染它,因为这是很慢的。
因此,我们可以更新网页的一部分,并且用户是可以看见这种改变的,就像用户向下滚动Facebook的时间线页面来看他们想看的东西,随着新内容添加而不用重载整个页面。

具体问题

开发几乎100%基于Ajax的Web应用已经不是一件新鲜事了,但是当一个网页同时发送两个及以上的Ajax请求时,你会注意到请求会花费很长时间,并且几乎在同一时刻完成了请求。

造成的原因

当你想服务器发送一个Ajax请求时,PHP脚本也开启了session_start(),它的调用会锁定PHP的session文件。
你可能已经知道,PHP默认会把session数据存储在服务器上的文件中。因为仅仅只有一个PHP请求能改变同一个session文件,两个同时的PHP请求可能会造成典型的文件锁条件,因此,任何一个其他由PHP调用的对于同一个用户的session_start()请求将不得不等到第一个请求结束。
现在,大部分PHP框架会首先在主文件中使用session_start()。因此,如果你正在使用会调用session_start()的框架或者函数库,将会造成session文件锁,对于使用同一个浏览器的相同用户,这将延迟同时发送的Ajax请求。

问题的解决方法

调用session_write_close()函数会使PHP写入session文件并关闭它,因此释放session文件后,另一个请求就有权限写入。
调用session_write_close()之后,当前脚本会继续正常运行,但你应该清楚在调用session_write_close()之后不允许改变任何session变量;在同一个脚本中,其它同时发送给PHP的请求可以锁定session文件并改变session变量。
为了让你看到这种问题,我创建了测试代码并将它上传到了github。你可以再这里找到测试脚本。在本地,你需要用一个实例来使用测试代码,然后打开浏览器控制台,查看请求和响应时间。
正如我们在这个文件中看到的示例代码,如果我们像下面代码这样,创建多个请求…

session_start();
sleep(5);

同一个用户的每个请求完成之前都将等到前一个请求完成。它将用时5s,因为知道脚本完成之前,session文件都没有被释放。因此,当第一次调用session_start()时,新的请求将被阻塞。那将杀死异步请求的想法,也就是说,多个请求会在同一时间被发送和被执行。
如果将文件中的代码改一下:

session_start();
// do something useful here
session_write_close();
sleep(5);

第三行代码将释放session文件锁,所以另一个并发请求不需要等待就能运行,因为它可以调用session_start()而不会有任何问题。

总结

PHP有些微妙,会让你担心为什么奇怪的事情会发生。但是一旦你理解事情是怎么运行的,一切将变得有意义,并且你能更好的思考去解决问题。

译文出处:http://www.ido321.com/1577.html

本文根据@Eslam Mahmoud的《Fix the AJAX Requests that Make PHP Take Too Long to Respond》所译,整个译文带有我自己的理解与思想,如果译得不好或有不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://www.phpclasses.org/blog/post/277-Fix-the-AJAX-Requests-that-Make-PHP-Take-Too-Long-to-Respond.html

解决AJAX请求使PHP反应时间过长的问题相关推荐

  1. php 响应时间,PHP下解决ajax请求服务器响应时间过长问题

    PHP下解决ajax请求服务器响应时间过长的办法:首先在浏览器输入测试网址,找到Networky以及ajax发送的请求:然后找到TTFB的响应时间对应的php文件,并删掉这些代码:最后将数据库loca ...

  2. ajax请求提示html状态码302,快速解决ajax请求出错状态码为0的问题

    今天在使用 ajax 向后台请求数据时出现错误,提示状态码为 0 ,后台采用的是 spring mvc 架构. 状态码为0是什么意思呢?查找了下,原来它意味着 (未初始化)即没有调用到send()方法 ...

  3. 解决Ajax请求时无法重定向的问题

    解决Ajax请求时无法重定向的问题 参考文章: (1)解决Ajax请求时无法重定向的问题 (2)https://www.cnblogs.com/lgjlife/p/10445483.html 备忘一下 ...

  4. 解决ajax请求跨域,解决ajax请求跨域

    跨域大部分需要通过后台解决,引起跨域的原因: 3个问题同时满足 才可能产生跨域问题,即跨域(协议,主机名,端口号中有一个不同就产生跨域) 下面是解决方法 方法一 // ajax请求跨域 /* *解决a ...

  5. php ajax session失效,PHP中解决ajax请求session过期退出登录问题

    1.session过期,如果直接是url请求,或者用户在打开的系统页面中直接清除缓存及cookie信息,可直接在php的入口文件中调用以下封装的方法,进行session信息判断以及页面的跳转,如: i ...

  6. ajax传递timestamp,解决ajax请求自动增加时间戳问题

    解决zepto ajax请求时自动增加时间戳问题 $.ajax({ url: url,type: 'get',async:false,headers : {'Accept-Encoding' : 'g ...

  7. ajax去掉session,PHP中解决ajax请求session过时退出登陆问题

    一.session过时,若是直接是url请求,或者用户在打开的系统页面中直接清除缓存及cookie信息,可直接在php的入口文件中调用如下封装的方法,进行session信息判断以及页面的跳转,如: p ...

  8. 监控ajax请求的时间,找出完成Ajax请求所需的时间

    繁星淼淼 由于javascript使用事件队列,因此无法提供准确的时间.这意味着您的程序可以这样执行:开始AJAX请求同时处理等待的鼠标单击事件/任何其他等待的代码行开始处理AJAX就绪响应不幸的是, ...

  9. java过滤器重定向_解决ajax请求过滤器重定向不跳转 (过滤器)

    最近写的一个servlet过滤器,用于拦截请求,判断用户是否登录. 写好后发现一个问题,当我直接在浏览器地址栏里输入地址,可以跳转页面:当点击按钮时,过滤器代码正常执行,但是页面没有跳转:是因为按钮都 ...

最新文章

  1. LeetCode刷题记录7——824. Goat Latin(easy)
  2. VC6中工具条的新特色
  3. mysql sqlserver分页_SQLServer常用分页方式
  4. 获得本机的IP,掩码和网关
  5. php 迭代器迭代中文时重复,3种方式解决iterator迭代器并发修改异常
  6. IDC报告:阿里云领跑中国数据库市场年度份额首超传统厂商
  7. swift 3.0 中使用 xib
  8. 输变电设备物联网节点设备无线组网协议_AIS-Link-艾森智能的工业物联网连接协议...
  9. Problem E: 分数统计
  10. 如何真正实现无提示保存Excel文档
  11. java 生成ai矢量图,PS和AI将图片转成矢量图
  12. Minimal Viable Plasma
  13. 2007年日历带农历表_2007年农历阳历表 2007年农历表 2007年日历表
  14. elasticSearch创建索引库、映射、文档
  15. 第二届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2023)
  16. [GDC 2015] Scroll Back - 2D 卷轴游戏的摄影机理论与实务
  17. 2015中考计算机考试时间,2015年中考考试科目安排
  18. python3 and
  19. 笔记33 笨办法学python练习40之二:类和对象
  20. matlab中设x=zsin3x,三阶偏导数设e的sin(2x+3y)次方,求Z的三阶偏导数是多少?

热门文章

  1. Xtrabackup 增量备份
  2. 1. 计算机的应用领域,1-1计算机的发展概况及应用领域
  3. c语言实例--十进制转化为二进制
  4. PS制作三原色叠加效果教程
  5. Linux如何安装集群及细节操作
  6. python应用程序无法正常启动0xc0000142_应用程序无法正常启动0xc0000142解决方法
  7. 微信小程序--基础内容(详解)(一)
  8. VC对11类NFT初创企业的看法与建议
  9. 基于MATLAB GUI的魔方三维动态还原仿真程序
  10. Linux为什么最多能分4个四个主分区