php session 异步,Ajax异步请求PHP服务器,如何做到无阻塞响应 原创 学习与分享 PHP自学...
最近发现了一个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.状态码:100~ 2.状态码:200~ 3.状态码:300~ 4.状态码:400~ 5.状态码:500~ 响应状态码表示服务器的响应状态,在爬虫开发过程中,向服务器发送一个请求,服务器会根据 ...
- ajax post 请求数据服务器返回500错误
一 .问题描述: 转移一个程序到服务器上,之前的服务器一切正常,今天客户反应内容的分类不显示了,进入后台发现post请求返回500错误 二.解决方法: 报错示例代码: $.ajax({type:&qu ...
- 用ajax传值input file,获取 input type=file 标签的内容,并使用ajax进行请求到服务器...
数据结构:栈 顺序表方法和单链表方法(python版) #!/usr/bin/env python # -*- coding:utf-8 -*- class StackUnderflow(ValueE ...
- php ci post 请求,CI框架中判断post,ajax,get请求的方法
这篇文章主要介绍了关于CI框架中判断post,ajax,get请求的方法 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 CI框架当中并没有提供,类似tp框架中IS_POST,IS_A ...
- 服务器与网页之间异步,在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)...
在一次做非常复杂的ajax应用时,如果一个会话已经超时,但是此时再通过ajax请求,那么ajax返回的则是一个登陆页面的html,那这下就惨了,页面上而已就乱了,那么,能否在Java端,如拦截器里判断 ...
- 在ajax异步请求服务器报500万能解决方法
1. 使用抓包工具Fiddler.exe 2. 请求该异步ajax 3. 复制Fiddler的TextView 里的错误信息文本 4. 打开文本后排查bug.
- JSP同步请求和html+ajax异步请求的两种方式
war包:包括所有的项目资源,只要从浏览器发起的都是属于请求,然后把资源响应给浏览器,解析显示出来. 方式一:HTML+ajax(跳转静态html也是属于请求响应,把整个页面响应给浏览器.) html ...
- html弹窗赋值给查询框,bootstrap模态框动态赋值, ajax异步请求数据后给id为queryInfo的模态框赋值并弹出模态框(JS)...
/查询单个 function query(id) { $.ajax({ url : "/small/productServlet", async : true, type : &q ...
- Ajax异步请求-简单模版
1 <script type="text/javascript"> 2 window.onload = function () { 3 document.getElem ...
最新文章
- 【转】关于Apache与Nginx的优势比较
- java中处理字符编码(网页与数据库)(转)
- 分享一个slide:花式自然语言处理
- 个人作业5——软工个人总结
- Hibenate映射属性
- 学历真的改变能命运? | 数据告诉你
- Andorid提高--数据持久化
- JAVA日常优化---Guava缓存玩耍异步刷新
- Python实现连点器
- 50步带你在windows PC上创建属于自己的虚拟机(一)
- Nacos6# Distro协议全量同步与校验
- C语言程序判断一个数是否是素数,C语言中怎么判断一个数是否是素数(即质数)...
- 企业支付宝转账到银行卡(免费率 无限额)PHP 演示示例
- 2015年秋季腾讯校园招聘开发岗笔试题(四道大题)
- 录音转文字软件哪个好?推荐这三款软件给你
- 波音承认 737MAX 飞行模拟器存在缺陷;韩国政府计划从 Win7 迁移到 Linux
- 微信公众平台万能代码详解-php语言(二)
- excel解析html代码,使用excel vba解析HTML的错误
- vue改变class内的属性_vue绑定html的class属性的方法
- c语言零基础第三课:运算符学习
热门文章
- matplotlib如何设置xlabel以及ylabel的位置和大小
- Python基础学习(函数、模块、面向对象)
- 【Linux】面试题4.0
- 第10章 车间工位吊 多工况移动载荷分析(多工况的添加、结果分析) 多工况计算、
- cuda10.1的一步步详细安装记录
- android volley缓存图片,android – 如何获取使用Volley ImageLoader下载的缓存位图?
- iApp 时间戳互转
- i.MX6ULL快速上手 | 01 - i.MX6ULL Alpha开发板快速上手
- iWatch的功能预测
- 微信小程序 wepy 框架 手势密码 ios 安卓 真正的无卡顿