php提前输出响应及注意问题

1、浏览器和服务器之间是通过HTTP进行通信的,浏览器发送请求给服务器,服务器处理完请求后,发送响应结果给浏览器,浏览器展示给用户。如果服务器处理请求时间比较长,那么浏览器就需要等待服务器的处理结果。

但是,有时候,浏览器不需要等待服务器的处理结果,只要发送的请求已经被服务器接收到。所以,这种情况下,浏览器希望服务器接收到请求立即返回一个响应,比如字符串‘success‘。这样浏览器可以继续执行后续代码。

解决方法,

使用的服务器是nginx+fpm

echo ‘success‘;

fastcgi_finish_request();

//执行耗时代码

如果服务器使用的是apache、ob_end_flush();

ob_start();
echo ‘success‘;

header("Content-Type: text/html;charset=utf-8");
header("Connection: close");
header(‘Content-Length: ‘. ob_get_length());

ob_flush();
flush();//执行耗时代码

2、测试1》test.html
<!DOCTYPE html>
<html>
<head>
  <title>郭颖的测试</title>
  <meta charset="utf8">
</head>

<body>
</body>
<script src="jquery-3.0.0.js"></script>
<script>
function getCurTime(d) {
  var time = d.getFullYear() + "-" +(d.getMonth()+1) + "-" + d.getDate() + " " + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds();
  return time;
}

function getOther(url) {
  $.ajax({
    url: url,
    success:function(data){
      console.log(data);
      console.log(getCurTime(new Date()));
    }
  });
}

console.log(getCurTime(new Date()));
$.ajax({
  url: "http://localhost/test.php",
  success:function(data){
    console.log(data);
    console.log(getCurTime(new Date()));
    getOther("http://localhost/test2.php");
  }
});

</script>
</html>

2> test.php

<?php
echo ‘success‘;
//使用sleep函数模拟耗时任务,耗时5秒
sleep(5);
?>

3>test2.php

<?php
echo ‘this is test2.php‘;
?>

运行localhost/test.html

在控制台输出

由此可以看出

浏览器需要等待test.php文件执行完才能去请求test2.php文件。

接下来修改test.php文件内容,提前输出响应

<?php
if(!function_exists(‘fastcgi_finish_request‘)) {
  ob_end_flush();
  ob_start();
}
echo ‘success‘;

if(!function_exists(‘fastcgi_finish_request‘)) {
  header("Content-Type: text/html;charset=utf-8");
  header("Connection: close");
  header(‘Content-Length: ‘. ob_get_length());
  ob_flush();
  flush();
} else {
  fastcgi_finish_request();
}

sleep(5);
?>
时间: 2024-10-16 00:31:35

php提前输出响应及注意问题的相关文章

HTTP 输出响应内容工具类

ResponseUtils.java package javax.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.net.URLEncoder; import javax.servlet.http.HttpServletRespons

关于系统首页绘制问题(ext布局+c#后台添加数据)经html输出流输出响应客户端

关于系统首页绘制问题,业务需求: TODO: 1,绘制系统首页(Main.aspx) 2,采用的技术:functioncharts+jquery+ext布局+c#+html 讲解篇:1,服务端aspx,2,服务端后台返回数据(这里采用服务器端程序:aspx.cs) 1,服务端aspx <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Main.aspx.cs" Inherit

PHP的header函数头部输出的问题解析

<?php /* header('Location : http://segmentfault.com/');这个方法,是在响应头里面,发一个302重定向.而响应头当然要比响应主体要提前输出. */ echo "<html></html>"; header('location:http://www.baidu.com'); /*但是运行以上发现成功跳转名,是因为这种并不符合HTTP规范的HTTP头,很可能整个HTTP Response都无法解析. 幸运的是

通过HttpWebRequest请求与HttpWebResponse响应方式发布接口与访问接口

一.API接口的编码 1.首页的页面代码: protected void Page_Load(object sender, EventArgs e) { /* * 请求路径:http://xxxx/index.aspx?appkey=&security=&t=&method=&... * appkey是调用者身份码(系统分配) * security是当前请求安全码(安全码=MD5(Key + Method),key为系统分配或调用者自行设定) * t是请求模块(Member

Node.js与Sails~自定义的Response响应体

在Node.js里,你可以控制请求和响应,自己可以定义自己的响应方式,如对文本如何响应,对json如何响应,对图像流如何响应等等,而这些在Sails架构里,变得更加容易和清晰了,它位于项目的api/responses目录下,你可以定义自己的响应体. 其实sails为我们封装了一些标准的相应,如view方法,这也就是一种响应体,它可以将文本,json对象渲染到指定的视图上,而我们自己可以效仿它,实现自己的响应体,下面代码是官方给出的一个实例,它的方法名为myResponse,这是sails架构一个

HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码

HttpServletResponse  和 ServletResponse  都是接口 具体的类型对象是由Servlet容器传递过来 ServletResponse对象的功能分为以下四种: ?        设置响应头信息: ?        发送状态码: ?        设置响应正文: ?        重定向: 设置响应头信息 HttpServletResponse 中 (ServletResponse 中没有的) void setHeader(String var1, String v

NIO开发Http服务器(4):Response封装和响应

最近学习了Java NIO技术,觉得不能再去写一些Hello World的学习demo了,而且也不想再像学习IO时那样编写一个控制台(或者带界面)聊天室.我们是做WEB开发的,整天围着tomcat.nginx转,所以选择了一个新的方向,就是自己开发一个简单的Http服务器,在总结Java NIO的同时,也加深一下对http协议的理解. 项目实现了静态资源(html.css.js和图片)和简单动态资源的处理,可以实现监听端口.部署目录.资源过期的配置.涉及到了NIO缓冲区.通道和网络编程的核心知识

java-网络编程(TCP-服务端响应客户端)

网络编程详解-TCP 一,TCP协议的特点              面向连接的协议(有发送端就一定要有接收端)    通过三次连接握手建立连接 通过四次握手断开连接 基于IO流传输数据 传输数据大小没有限制 速度慢但可靠 二,TCP协议相关的两个类     Socket(一个socket对象表示一个客户端对象)            常用构造方法介绍 Socket(String host, int  port)       host参数为服务器的ip地址字符串      port参数为服务器的

八、请求响应基础

请求响应流程图 response 1 response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse.在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法.response对象是用来对客户端进行响应的,这说明在service()方法中使用response对象可以完成对客户端的响应工作. response对象的功能分为以下四种: l 设