php与ajax交互——实现php实时返回结果给ajax,并在后台保持继续运行的方法

前端页面数据传递到后台PHP进行处理并返回显示 在这个过程中,JavaScript可以用来收集用户输入的数据并将其发送到后台,而PHP则可以用来处理这些数据并生成相应的响应。首先,在前端页面中,我们需要通过JavaScript收集用户输入的数据,并将其发送到后台进行处理。当用户在前端页面输入数据并点击发送按钮时,数据将被发送到后台进行处理,然后后台将处理结果返回给前端,前端可以根据需要对结果进行相应的展示。在前端页面的JavaScript代码中,我们在AJAX请求的回调函数中可以获取到后台发送回来的响应数据。方法发送请求,并将输入的数据作为参数传递。 阅读详情

最近做个人项目的时候,遇到一个问题,就是点击页面上一个按钮后,通过ajax调用php接口,ajax根据返回的数据对页面做一些改变。但同时,这个按钮点击后要存储大量的数据到数据库中。由于前端页面的变化要求快速响应,因此需要php快速返回计算结果,然后后台继续运行与数据库的交互部分代码。由于php返回给ajax数据是通过echo形式,因此第一时间想到flush函数,然而试了下却发现行不通,于是在网上找了下办法,发现大部分是针对html页面的实时交互,这类方法对ajax是无效的。如(引用网上代码):

set_time_limit ( 0 );
ob_end_clean ();
ob_start ();
$i = 10;
while ( $i > 0 )
{
 $flush = $i . "<br/>";
 #Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,
 #所以必须发送一些额外的空格来让这些浏览器显示页面内容
 $flush = str_pad ( $flush, 1000 );
 echo $flush;
 ob_flush ();
 flush ();
 sleep ( 1 );
 $i --;
}

这种方式适用于直接输出结果到页面,而不能返回结果给ajax。这两种方式的区别如下:
在浏览器访问时能成功的原因是:浏览器在接收缓冲区装满时,就立即解释收到的数据,而不等待通讯的结束
在Ajax访问时不成功的原因是:XMLHttpRequest组件只负责交换数据,不负责处理数据。处理数据的代码要等到通讯结束后才执行。如果Ajax不以XMLHttpRequest 做传输载体,而以 iframe 做载体的话,上述代码是可以成功的。

后来实在没找到解决办法,可能是我搜索水平有限。。。
没办法只能去stackoverflow上求助,幸好我的英语能凑合描述清楚问题,得到了两位外国友人的帮助,成功解决。下面看下大牛提供的方法(自己补了一点中文注释):

//省略php接口中处理数据的代码
 echo json_encode($res);//返回结果给ajax
 // get the size of the output
 $size = ob_get_length();
 // send headers to tell the browser to close the connection
 header("Content-Length: $size");
 header('Connection: close');
 ob_end_flush();
 ob_flush();
 flush();

 /******** background process starts here ********/
 ignore_user_abort(true);//在关闭连接后,继续运行php脚本
 /******** background process ********/
 set_time_limit(0); //no time limit,不设置超时时间(根据实际情况使用)
 /******** Rest of your code starts here ********/
 //继续运行的代码
 ...
 ...

不得不说老外解答问题很有耐心,两个回答都写了很多注释,思路一目了然,我就不再赘述了。

PS:由于php的特性,因此在后台运行代码,依然会影响对其他请求的处理,所以对于长时间运行的代码可以考虑另起一个进程来处理,或使用多线程(swoole),或者使用消息队列(如rmq)等方式来代替。

水平有限,欢迎指正~

参考:
http://fc-lamp.blog.163.com/blog/static/174566687201271025332854/
http://bbs.youkuaiyun.com/topics/390843794
http://stackoverflow.com/questions/37182850/how-to-php-send-result-to-ajax-immediately/37183216#37183216

如何用PHP将数据库中的数据实时显示在网页上? Ajax这个术语源自描述从基于Web的应用到基于数据的应用,它不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。这样,每当指定的时间间隔过去时,JavaScript文件就会通过Ajax调用PHP脚本,获取最新的数据并将其插入到HTML文件中的指定位置。2.在PHP文件中,编写一个从数据库中检索数据的脚本来返回数据并将其插入到HTML文件中。1.在您的HTML文件中,创建一个div元素来显示数据库中的数据。 阅读详情

相关推荐

《深入理解Ajax与PHP:基础到高级应用》

本文还有配套的精品资源,点击获取 简介:本书详细介绍了Ajax与PHP的基础知识和高级应用,深入讲解了如何通过这两项技术提升Web应用的交互性和后台处理能力。教程从Ajax的基础技术讲起,包括XMLHttpRequest对象、JavaScript、DOM和CSS,然后引导读者创建第一个Ajax请求,并详细介绍了PHP基础语法。随着教程的深入,读者将学习到如何将PHP与Aja...

weixin_35755434的博客 1159

php 回显,PHP实时回显 实时输出结果的方法 实时反馈结果到浏览器

正常PHP在执行的时候,要等全部执行完毕才会输出结果,这样其实用户体验很差,其实可以实现实时回显PHP 里开启实时输出方法是 ob_implicit_flush() ,但它大部分情况下都不管用,因为 php.ini 配置里 output_buffering 输出缓冲大部分是 On 开启的,还有 zlib.output_compression 也经常会被开启,除了 PHP 这一层,还有 Nginx ...

weixin_32900811的博客 923

[Unity_Plastic SCM小技巧] 使用 UnityYAMLMerge 工具合并场景和预制件文件

首先YAMLMerge工具其实并不局限于PlasticSCM,git也可以,它是内置在Editor内的一个更加智能的版本控制工具,只不过正常不会启用,他的目录在C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe(Unity Editor安装目录),MAC上:/Applications/Unity/Unity.app/Content...

unityofficial的博客 1143

PHP实现Ajax长轮询

传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求。 反转AJAX,就是所谓的长轮询或者COMET。服务器与客服端需要保持一条长时间的请求,它使得服务器在有数据时可以返回消息给客户端。

NiceGY 8488

LabVIEW QMH模板实战:从创建到错误处理的完整指南

本文提供LabVIEW QMH模板从创建到错误处理的完整实战指南。详细解析了队列消息处理器(QMH)作为LabVIEW核心设计模式如何实现任务解耦与异步通信,涵盖事件处理循环、消息处理循环的搭建、用户事件创建、队列引用管理、消息优先级控制以及健壮的错误处理机制,帮助开发者构建稳定、可维护的复杂应用程序。

white的博客 725

小样本学习概述

目录 前言 小样本学习存在的意义? 什么是小样本学习? 小样本学习的方法有哪些? 结语 前言 小样本学习(Few-Shot Learning)是近几年兴起的一个研究领域,小样本学习旨在解决在数据有限的机器学习任务。 小样本学习存在的意义? 近些年,以深度卷积神经网络为代表的深度学习方法在各类机器学习任务上取得了优异的成绩——很多任务上已经超越了人类表现。狂欢背后,危机四伏。因为这些深度学习方法work的关键之一是海量标注数据的支持。 但是在工业界,很多时候难以获得海量的训练数据,更.

DwD-的博客 3万+

javascript逐行显示数据及php实时输出前端内容后台保持继续运行的解决方案(setTimeout定时器、flush和ob_flush函数、安装进度展示)

在数据可视化大屏显示的过程中,需要ajax读取后台数据,然后在前端显示出来。一般来说,异步加载后,遍历循环输出,数据正常情况下会一下子全部展示出来,能不能将返回的数据逐行输出呢案例采用Discuz!安装进度的经典案例作为分析。

挖掘大数据价值,让决策者快速洞悉趋势,让大众读懂数据背后的故事。 1099

一文学会python基础知识

1. python 运行环境 1.1 脚本式环境 1.2 交互式环境 2. python 注释 3. 变量及变量命名 4. 关键词 BIFS 5. 标准操作符 6. 条件判断 7. 循环 8. python 数据类型 9. python 序列 9.1 序列-字符串(str) 9.2 序列-列表 9.3 序列-元组 10. 字典 11. 集合 12. python内存管理及可变、不可变对象 13. 函数 13.1 函数参数 13.2 return and yiled(生成器) 13.3 参数传递处理 ...

weixin_43178406的博客 26万+

PHP后台运行

转载自:http://23live.cn/web/php-ajax/ 在很多时候,我们需要通过用户或其他方式触发php脚本的运行,而php执行的是批量任务或者是很耗时间的操作,这样我们就想客户端断开连接,而php的代码照样执行,起到异步操作的效果。 这里跟大家分享一段代码,可以完美的实现php后台异步运行的效果,而且不用客户端一直保持连接状态。 1 2...

aqc802886的博客 403

12、知识图谱数据处理与推理全解析

本文深入解析了知识图谱中的数据处理与推理技术,涵盖SHACL的多种约束类型(如值约束、范围约束、字符串约束、逻辑约束等)及其在数据质量控制中的应用,并介绍了常用的SHACL工具与实际案例。文章对比了SPARQL与SHACL的特点,探讨了RDF(S)的局限性,引出表达能力更强的OWL和OWL2语言及其在语义网和生物医学等领域的应用。此外,还阐述了规则在知识表示中的作用,包括产生式规则和Datalog规则,并总结了知识图谱中推理的重要性与典型流程,为构建高质量、可推理的知识图谱提供了全面的技术指导。

zz67890的博客 135

【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件

本文介绍了如何将C#游戏开发中的代码从单个.cs文件拆分到多个.cs文件中,以提升代码的可维护性和可读性。文章演示了在Visual Studio中创建Hero类和ShowInfo类的具体步骤:通过右键项目名添加新建类,将原有代码分别剪切到对应的类文件中,并自动生成命名空间。拆分后需要在Program.cs中通过"using"指令引用这些类,最后通过运行测试验证功能正常。这种模块化代码组织方式能有效解决单一文件代码过长、结构混乱的问题。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1135

php高效轮询,PHP怎么实现AJAX长轮询

PHP怎么实现AJAX长轮询发布时间:2020-06-22 17:00:31来源:亿速云阅读:82作者:LeahPHP怎么实现AJAX长轮询?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。这里使用AJAX请求data.php页面获得‘success’的值,请求的时间达到80秒。在这80秒中若没有从服务端返回‘success’则一直保持连接...

weixin_28951585的博客 323

手把手教你学Simulink——基于电机驱动系统的场景实例:轮毂电机在电动汽车中的分布式驱动控制仿真

本文详细介绍了基于MATLAB/Simulink和Simscape Electrical的电动汽车轮毂电机分布式驱动控制系统建模方法。内容包括系统结构设计(轮毂电机、逆变器、控制器等模块)、完整的建模过程(从基础模块导入到车辆动力学建模)、控制器设计与转矩分配策略实现,以及仿真参数设置与结果分析。通过仿真验证了该分布式驱动系统在速度跟踪、转弯性能等方面的优异表现,为电动汽车驱动系统的研究与开发提供了有效的仿真验证平台。文中还提供了相关代码示例和资料推荐,是学习Simulink电机控制系统建模的实用指南。

MHD0815的博客 4914

php 反向ajax实现,反向ajax

反向ajaxajax长循环,又叫comet机制,但是我最喜欢的还是叫他反向ajax反向ajax,顾名思义,就是不是客户端来请求服务器端,而是服务器端请求客户端,这样做的好处是节省了大量以前轮询造成的查询浪费,从而减轻数据库压力和服务器压力那么如何实现反向ajax呢?主体1.在客户端写一个ajax,这个ajax里设置一个过期的时间 timeout,这个过期的时间timeout是用来暂时延长ajax的...

weixin_42105169的博客 216

西门子G120变频器在立体仓库堆垛机应用参数设置

本文详细介绍了G120 CU240E及CU250S变频器的参数设置流程。主要内容包括:1)快速调试步骤,从新建项目、扫描节点到设置电机类型、负载类型等参数;2)抱闸参数设置方法;3)参数下载异常时的处理方案。重点说明了通过STARTER软件进行向导式调试的完整过程,包括电机铭牌参数输入、识别方式选择等关键环节,并提示了通讯连接注意事项。当下载失败时,提供了通过导入导出项目文件解决问题的具体方法。

xdpcxq的专栏 863

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

php+ajax+在线测试,PHP+Ajax实现在线聊天功能

PHP+Ajax实现在线聊天功能2017年07月29日 16:39:14阅读数:489软件描述HTML首先我们放置一个获取数据按钮和数据存放地方#msg。jQuery我们向ajax.php请求,请求的时间设置80秒。在这80秒中若没有从服务端返回‘success’则一直保持连接状态,直到有数据返回或‘success’的值为0才关闭连接。在关闭连接后在继续下一次的请求。$(function() {$...

weixin_39526185的博客 189

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

js与session配合的定时器实现刷新继续保持定时器运行

为确保安全一些时间阈值定义在后台,自行实现即可。 一,Html部分 &lt;html&gt; &lt;head&gt; &lt;script src="https://cdn.bootcss.com/jquery/2.2.3/jquery.min.js"&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;input typ

youcijibi的博客 1365

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ajax long poll,Comet 反Ajax: 基于jQuery与PHP实现Ajax长轮询(LongPoll)

传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求。反转AJAX,就是所谓的长轮询或者COMET。服务器与客服端需要保持一条长时间的请求,它使得服务器在有数据时可以返回消息给客户端。Comet是一种服务器向页面推送数据的技术,Comet能让信息近乎实时的被推...

weixin_30420027的博客 223

php 实现长轮询,PHP实现Ajax长轮询_PHP教程

PHP实现Ajax长轮询传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求。反转AJAX,就是所谓的长轮询或者COMET。服务器与客服端需要保持一条长时间的请求,它使得服务器在有数据时可以返回消息给客户端。这里使用AJAX请求data.php页面获得‘suc...

weixin_42524004的博客 374

PHP反向ajax,PHP ServerPush 数据推送技术 即反向Ajax

随着人们对即时性应用需求的不断上升,服务推送技术在聊天、消息提醒尤其是社交网络服务技术开始兴起,成为实时应用的数据流核心。这篇文章试图探讨的便是各种适合于PHP的数据推送的实现方式以及其优劣。1. 什么是Server Push想象在聊天应用中,如果使用传统的ajax来承担消息的传入,那么一般是通过每隔一定时间拉取一次信息的方式实现,但是其实这种方式有大量查询是浪费的。聊天等Web应用更需要服务器在...

weixin_39724889的博客 212

刷新网页倒计时 php,PHP+JavaScript实现刷新继续保持倒计时的按钮

场景:发送一个验证码到手机,当验证码发出时,会提示隔 1 分钟之后可以再次发送。通常有这几种方式防止恶意请求,一是再次发送之前需要输入验证码,二是在指定的时间间隔之内不能再次发送。推荐:《PHP视频教程》有些网站在 1 分钟的间隔之间之内发送按钮的确是禁用了,但是只要刷新浏览器,或者通过 F12 工具修改 Button 的 disabled 属性,在时间间隔之内仍然可以点击按钮。需要在刷新的情况下...

weixin_36473811的博客 508

php弹幕技术轮询,PHP+Ajax实现在线聊天长轮询

HTML首先我们放置一个获取数据按钮和数据存放地方#msg。jQuery我们向ajax.php请求,请求的时间设置80秒。在这80秒中若没有从服务端返回‘success’则一直保持连接状态,直到有数据返回或‘success’的值为0才关闭连接。在关闭连接后在继续下一次的请求。$(function(){$("#btn").bind("click",{btn:$("#btn")},functio...

weixin_33444829的博客 325

Ajax调用php函数返回数据,通过Ajax调用从函数返回值

小编典典问题是,onreadystatechange直到……等待……状态改变后才会触发。因此,当您returnstatus;大部分时间处于状态时,就没有时间设置。您需要做的returnfalse;始终是onreadystatechange确定您是否要继续进行。如果您这样做,则提交表单。简而言之,采用处理返回值的代码,而是从readystatechange处理程序中运行它。您可以直接执行以下操作:r...

weixin_42498347的博客 424
上一篇: printf()的用法
下一篇: 通过phpexcel读取excel文件到数据库 实例
puddingpp
博客等级 码龄9年 10粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值