QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 896|回复: 0

[PHP] PHP使用反向ajax开发

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1294 小时
   最后登录 : 2024-11-21

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2023-4-23 12:58:43 | 显示全部楼层 |阅读模式
在正常情况下,如果一个页面需要进行部分数据更新操作,只需要发送一个异步请求到服务器,而后接受服务器返回的数据。但是有些业务可能需要由服务器推送数据给客户端,此类业务该如何实现呢?这类业务一般可以使用websocket或者反向ajax。4 d  q3 q$ T5 W8 Y9 e
websocket:
+ ?" h; J& M6 Q5 iwebsocket不必多说,他是一个长连接,可双向数据通信。但是成本比较高,适合做即使通讯。$ v& R$ l* a' s; e3 `; ]
反向ajax:4 _7 ?7 L, e) I  |+ r8 g
反向ajax是指客户端不必从服务器获取信息,服务器会把相关信息直接推送到客户端。在一个标准的HTTP Ajax请求中,数据是发送给服务器端的,而反向Ajax可用某些特定的方式来模拟发出一个Ajax请求,让服务器尽可能快地向客户端发送事件。# O& w9 O+ X" l/ k3 M( v" N
反向ajax后端PHP具体实现代码:
/ v1 q# j4 t& q  y4 ?, Z6 e在PHP中实现反向ajax需要使用ob缓存,通过不断的输出ob缓存区的内容到客户端
- B3 {) [2 z! R8 L2 K- o2 T& S. x
  1. <?php
  2. //开启ob缓存
  3. ob_start();
  4. // 防止其他地方有缓存写入,我们先将缓存区清空
  5. //输出缓冲区内容并关闭缓冲区
  6. ob_end_flush();
  7. //输出缓冲区中的内容
  8. ob_flush();
  9. $i = 1;
  10. while(true){
  11.     echo $i;
  12.     //输出缓冲区中的内容
  13.     ob_flush();
  14.     //刷新系统输出缓冲区
  15.     flush();
  16.     //暂停1秒
  17.     sleep(1);
  18. }
最近非常火爆的ChatGPT,有很多国内的客户端就利用了反向ajax原理实现了动态回复的效果。同样是HTTP请求,却可以实现不一样的效果。* j6 T& l9 j0 Y' m2 {
如果没有实现效果可以关闭PHP配置文件中的output_buffering = off+ F) A4 U2 ]! O% a# Z( {4 R* _
注意:看网上说这个必须通过php配置文件关闭,不能通过ini_set()设置) p; P7 ]) {3 L5 y6 f- l8 L
大家可以通过 php --ini 查看配置文件路径
关闭nginx的gzip压缩功能、代理缓存及开启keep长连接; ]0 ^# A& W9 _1 O" O' W0 m
  1. location ~ [^/]\.php(/|$) {
  2.     proxy_buffering off; #关闭代理缓存
  3.     gzip off; #注意这个是关闭gzip压缩功能,必须要
  4.     fastcgi_keep_conn on; #开启keep连接,这个必须要
  5.     fastcgi_pass unix:/dev/shm/php-cgi.sock;
  6.     fastcgi_index index.php;
  7.     include fastcgi.conf;
  8. }
前端对接
* l- L+ l6 _2 m. Y- K前端对接有点麻烦,如果你使用jquery可能无法实现实时显示的效果。因为jquery的Ajax请求有缓存作用,success的回调是请求完成后的回调,但是反Ajax是分段返回,返回第一部分数据后依然保持连接继续等待返回,不过我们可以使用原生js实现,具体如下:
" V- U. g4 H6 Q8 l3 C+ n8 v
  1. //创建请求对象
  2. var xhr = new XMLHttpRequest();
  3. //设置请求方法及url
  4. xhr.open('get','ajax.php',true);
  5. //设置请求头
  6. xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  7. //监听返回的数据
  8. xhr.onreadystatechange = function (res){
  9.     console.log(res,this.responseText);
  10.     //可以在这里获取document节点实时显示数据
  11. }
  12. //发送请求
  13. xhr.send();
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-21 19:01

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表