异步请求PHP服务器,不返回数据?(附解决办法)

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

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

经多次测试才发现:– 不同浏览器,请求不同域名-不阻塞:无需实验– 不同浏览器,请求同域名-不阻塞:session_id()返回不同– 同一浏览器,请求不同域名-不阻塞:session_id返回不同– 同一浏览器,请求同域名-阻塞:session_id()返回相同

发现问题所在:1 关闭XDEBUG2 SESSION锁3 清除输出缓冲区

1 关闭XDEBUGXDEBUG是实时调试。调试时,它将保持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代码

<form>
<input type=;submit; value=;提交; />
</form>

<script src=;//cdn.bootcss.com/jquery/3.1.1/jquery.min.js;></script>

<script type=;text/javascript;>
$(;form;).on(;submit;, function(e) {
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;
);
});
</script>

php代码

<?php
session_start();$action = $_GET[;action;];
if ($action == ;post;) {

$_SESSION[;time;] = 0;
session_write_close();

while ($_SESSION[;time;] < 5) {
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视频教程》

PHP7留言板开发之 Ajax异步提交

转载2020-12-18 09:10:46925 + php学习QQ群(点击入群)

PHP7教程介绍关于留言板开发的Ajax异步提交

异步请求PHP服务器,不返回数据?(附解决办法)

php零基础到就业直播视频课:进入学习API 文档、设计、调试、自动化测试一体化协作工具:点击使用

推荐(免费):php7教程,ajax教程

前言

这节教程算是这个专辑的重中之重吧。随着前端技术的不断迭代更新,网站很多功能的实现都转移到前端去实现,2018年第一季度编程语言排名来看,JavaScript仍然是最受欢迎的编程语言。所以想要深入学习js,那么Ajax是必不可少的。

在前面课程讲过js验证,课件代码是在老友记之PHP7留言板开发(JS验证)基础上改动,只需加入ajax异步操作部分即可轻松完成。

需要注意的是,这里不再详细讲解什么是XMLHttpRequest对象,为什么要用它等等,相信你再能运用的情况下再去深入了解它会印象更加深刻,这里就尽可能的少一些文字类的应试教学并能达到学会效果。

打开编辑器开始动手吧!

Ajax异步的核心部分讲解

// 第一步 创建 XMLHttpRequest 对象,为了更容易理解,变量就用ajax
var ajax = new XMLHttpRequest();

// 第二步 初始化一个Ajax请求,url参数是远程请求地址ajax.php
ajax.open('POST', url, true); // 这里用到post提交留言,所以用post方式提交给服务器
// ajax.open('GET', url, true); // get方式请求服务器

// 第三步 发送请求;如果该请求是异步模式(默认),该方法会立刻返回。
ajax.send(inputdata);

// 第四步 发送请求总该要知道有没收到吧,这里就需要用到Ajax的事件监听器onreadystatechange
ajax.onreadystatechange = function(){
// 这里判断服务器是否有数据响应,如果有则做些你要处理的逻辑,比如提示用户操作成功
}

上面四步骤还理解不了的话,可以认为是第一步找个朋友A发邮件,第二步给这位A朋友写信件内容并封装写上地址贴邮票,第三步投递邮件,过了一阵(当然网络通的情况下立即有响应的),第四步收到A朋友的回信了,很开心。接下来就可以根据回信内容做事啦,比如见(网)面(约)…

好了就到这里,下面是完整代码。

HTML+JS页面代码

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>留言板_科科分享</title>
<!– 2.新建css样式文件并根据效果图编写css代码 –>
<link rel="stylesheet" href="feedback.css">
<!– 3.js表单验证 –>
<script type="text/javascript">
function checkform(){
var nickname = document.getElementsByTagName('input')[0].value; // 获取用户输入的姓名
var tel = document.getElementsByTagName('input')[1].value; // 获取用户输入的联系方式
var content = document.getElementsByTagName('textarea')[0].value; // 获取用户输入的留言内容
// 如果没有输入姓名 则提示
if(nickname == ''){
alert('请输入您的姓名');
document.getElementsByTagName('input')[0].focus(); // 将光标定位到姓名输入框
return false; // 阻止冒泡 输入姓名后才能通过
}
// 如果没有输入联系方式 则提示
if(tel == ''){
alert('请输入您的联系方式');
document.getElementsByTagName('input')[1].focus(); // 将光标定位到联系方式输入框
return false; // 阻止冒泡 输入联系方式才能通过
}
// 如果没有输入留言内容 则提示
if(content == ''){
alert('请输入您的联系方式');
document.getElementsByTagName('textarea')[0].focus(); // 将光标定位到留言内容输入框
return false; // 阻止冒泡 输入留言内容才能通过
}

// js已经拿到了用户提交的数据,那接下来就是AJAX(页面无刷新提交数据到服务器-异步通信)
// 异步请求 start
var ajax, url, inputdata;
// 创建 XMLHttpRequest 对象
if(window.XMLHttpRequest){
ajax = new XMLHttpRequest();
}else{
// 兼容Internet Explorer(IE5 和 IE6)使用 ActiveX 对象
ajax = new ActiveXObject("Microsoft.XMLHTTP");
}
url = 'ajax.php';
ajax.open('POST', url, true);
ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded;"); // 用POST的时候一定要有这句
inputdata = 'nickname='+nickname+'&tel='+tel+'&content='+content;
ajax.send(inputdata);
// 接收服务器返回的数据
ajax.onreadystatechange = function(){
// 获取服务器响应状态码
if(ajax.readyState == 4 && ajax.status==200){
// 获取服务器返回的响应返回的数据
var retdata = ajax.responseText;
if(retdata == 1){
alert('留言信息已提交成功!感谢您的宝贵意见。');
}
}
}
// 异步请求 end
return false; // 这里是为了方式submit点击后表单自动提交
// document.feedback_form.submit(); // 提交用户数据到后端action中的地址
}
</script>
</head>
<body>
<!– 工作区,呈现给用户看的 –>
<!– 1.开始搭建脚手架 –>
<p class="container_box">
<p class="up">
<h3 class="title">留言板</h3>
<h5 class="subtitle">FEEDBACK</h5>
</p>
<p class="down">
<form name="feedback_form" action="/#" method="post" onsubmit="return false;">
<p class="input">
<input type="text" class="fl" name="name" placeholder="输入您的姓名" />
<input type="text" class="fr" name="tel" placeholder="输入您的联系方式" />
</p>
<textarea class="content" cols="30" rows="10" name="nr"></textarea>
<input type="submit" onclick="checkform()" value="提交您的留言" class="sub" />
</form>
</p>
</p>
</body>
</html>

PHP代码(ajax.php)

<?php
include 'config.php';

// POST接收用户提交的数据
$nickname = !empty($_POST['nickname'])? addslashes(strip_tags($_POST['nickname'])):''; // 留言人名称
$tel = !empty($_POST['tel'])?addslashes(strip_tags($_POST['tel'])):''; // 留言人的联系方式
$content = !empty($_POST['content'])?addslashes(strip_tags($_POST['content'])):''; // 留言内容
$time = time(); // 当前系统时间,即用户留言时间

// 插入mysql语句
$sql = "INSERT INTO feedback (name, contact, content, addtime) VALUES ('{$nickname}', '{$tel}', '{$content}', '{$time}')";

// 立即执行mysql语句
$result = mysqli_query($mysqli, $sql); // 返回一个资源标识符,通常是数字
$insert_id = mysqli_insert_id($mysqli); // 返回数据表的自增长ID,比如新用户注册返回用户ID
// echo $insert_id; // 当你在调试的时候,你会发现echo是很好的帮手。
if($insert_id > 0){
// 如果入库成功,这里可以处理其他想要的逻辑
echo 1;
exit; // 退出程序,使其不再往下执行代码
}
// 这是错误的时候返回0
echo 0;
exit;

记得动手练习哦!欢迎下面评论区涂鸦!~

以上就是PHP7留言板开发之 Ajax异步提交的详细内容,更多请关注钦钦技术栈其它相关文章!

转载至:php中文网【www.php.cn】

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/25208/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022-09-23 1:06:34
下一篇 2022-09-23 1:06:56

软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!