最近发现了一个ajax异步请求的问题,用$.post、$.get、$.ajax请求PHP服务器时,总是无法异步返回数据。

经多次测试才发现:

-- 不同浏览器,请求不同域名-不阻塞:无需实验

-- 不同浏览器,请求同域名-不阻塞:session_id()返回不同

-- 同一浏览器,请求不同域名-不阻塞:session_id返回不同

-- 同一浏览器,请求同域名-阻塞:session_id()返回相同

发现问题所在:

1 关闭XDEBUG

2 SESSION锁

3 清除输出缓冲区

1 关闭XDEBUG

XDEBUG是实时调试。调试时,它将保持FPM以确保线程正在工作以避免数据污染。

典型的测试方法是,使用XDEBUG进行调试时,打开另一个浏览器并访问该站点,该站点这个时候是无法访问的。

这对并行响应有重大影响,即,即使前端发送多个请求,它也受XDEBUG控制,并且只能同时响应一个。

另外,由于XDEBUG依赖于SESSION,因此即使您使用session_write_close(),也要关闭会话锁(请参见下文)。

XDEBUG仍会自动打开。

2 SESSION锁

用 session_write_close() 关闭SESSION的写锁,这适合SESSION保存为File的情况。

如果SESSION保存在Redis,则不需要。

3 清除输出缓冲区

使用session_write_close()可能无法立即关闭SESSION锁,所以在这个方法之前加上:ob_end_flush()。

让 session_write_close() 马上生效。

4 示例

有如下一个范例,当点击【提交】按钮时,前端会给后台服务器发送两种请求。

一种是get请求,每隔1秒请求一次。

一种是post请求,最开始的时候发送一次,然后等待相应结束。

看看HTML代码

e.preventDefault();

// 每隔一秒请求一次服务器

var id = setInterval(function(){

$.get(

'save.php?action=get',

{},

function(data){

console.log(data);

},

'json'

);

}, 1000);

$.post(

'save.php?action=post',

{},

function(data){

console.log(data);

// 停止定时循环

clearInterval(id);

},

'json'

);

});

php代码<?php

session_start();

$action = $_GET['action'];

if ($action == 'post') {

$_SESSION['time'] = 0;

session_write_close();

while ($_SESSION['time']

session_start();

$_SESSION['time'] = $_SESSION['time'] + 1;

// 将SESSION数据写入文件中,并关闭写锁

session_write_close();

// sleep()模拟花费时间较长的程序,这样在关闭写锁之后,

// 服务器就能够相应别的请求,如下的$action=get,

sleep(1);

}

echo json_encode([session_id() => $_SESSION['time']]);

exit();

}

if ($action == 'get') {

echo json_encode([session_id() => $_SESSION['time']]);

exit();

}

php session 异步,Ajax异步请求PHP服务器,如何做到无阻塞响应 原创 学习与分享 PHP自学...相关推荐

  1. 向服务器发送请求,服务器返回给客户端的响应状态码列表及其代表含义

    目录 1.状态码:100~ 2.状态码:200~ 3.状态码:300~ 4.状态码:400~ 5.状态码:500~ 响应状态码表示服务器的响应状态,在爬虫开发过程中,向服务器发送一个请求,服务器会根据 ...

  2. ajax post 请求数据服务器返回500错误

    一 .问题描述: 转移一个程序到服务器上,之前的服务器一切正常,今天客户反应内容的分类不显示了,进入后台发现post请求返回500错误 二.解决方法: 报错示例代码: $.ajax({type:&qu ...

  3. 用ajax传值input file,获取 input type=file 标签的内容,并使用ajax进行请求到服务器...

    数据结构:栈 顺序表方法和单链表方法(python版) #!/usr/bin/env python # -*- coding:utf-8 -*- class StackUnderflow(ValueE ...

  4. php ci post 请求,CI框架中判断post,ajax,get请求的方法

    这篇文章主要介绍了关于CI框架中判断post,ajax,get请求的方法 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 CI框架当中并没有提供,类似tp框架中IS_POST,IS_A ...

  5. 服务器与网页之间异步,在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)...

    在一次做非常复杂的ajax应用时,如果一个会话已经超时,但是此时再通过ajax请求,那么ajax返回的则是一个登陆页面的html,那这下就惨了,页面上而已就乱了,那么,能否在Java端,如拦截器里判断 ...

  6. 在ajax异步请求服务器报500万能解决方法

    1. 使用抓包工具Fiddler.exe   2. 请求该异步ajax 3. 复制Fiddler的TextView 里的错误信息文本 4. 打开文本后排查bug.

  7. JSP同步请求和html+ajax异步请求的两种方式

    war包:包括所有的项目资源,只要从浏览器发起的都是属于请求,然后把资源响应给浏览器,解析显示出来. 方式一:HTML+ajax(跳转静态html也是属于请求响应,把整个页面响应给浏览器.) html ...

  8. html弹窗赋值给查询框,bootstrap模态框动态赋值, ajax异步请求数据后给id为queryInfo的模态框赋值并弹出模态框(JS)...

    /查询单个 function query(id) { $.ajax({ url : "/small/productServlet", async : true, type : &q ...

  9. Ajax异步请求-简单模版

    1 <script type="text/javascript"> 2 window.onload = function () { 3 document.getElem ...

最新文章

  1. 【转】关于Apache与Nginx的优势比较
  2. java中处理字符编码(网页与数据库)(转)
  3. 分享一个slide:花式自然语言处理
  4. 个人作业5——软工个人总结
  5. Hibenate映射属性
  6. 学历真的改变能命运? | 数据告诉你
  7. Andorid提高--数据持久化
  8. JAVA日常优化---Guava缓存玩耍异步刷新
  9. Python实现连点器
  10. 50步带你在windows PC上创建属于自己的虚拟机(一)
  11. Nacos6# Distro协议全量同步与校验
  12. C语言程序判断一个数是否是素数,C语言中怎么判断一个数是否是素数(即质数)...
  13. 企业支付宝转账到银行卡(免费率 无限额)PHP 演示示例
  14. 2015年秋季腾讯校园招聘开发岗笔试题(四道大题)
  15. 录音转文字软件哪个好?推荐这三款软件给你
  16. 波音承认 737MAX 飞行模拟器存在缺陷;韩国政府计划从 Win7 迁移到 Linux
  17. 微信公众平台万能代码详解-php语言(二)
  18. excel解析html代码,使用excel vba解析HTML的错误
  19. vue改变class内的属性_vue绑定html的class属性的方法
  20. c语言零基础第三课:运算符学习

热门文章

  1. matplotlib如何设置xlabel以及ylabel的位置和大小
  2. Python基础学习(函数、模块、面向对象)
  3. 【Linux】面试题4.0
  4. 第10章 车间工位吊 多工况移动载荷分析(多工况的添加、结果分析) 多工况计算、
  5. cuda10.1的一步步详细安装记录
  6. android volley缓存图片,android – 如何获取使用Volley ImageLoader下载的缓存位图?
  7. iApp 时间戳互转
  8. i.MX6ULL快速上手 | 01 - i.MX6ULL Alpha开发板快速上手
  9. iWatch的功能预测
  10. 微信小程序 wepy 框架 手势密码 ios 安卓 真正的无卡顿