PHP的输出缓冲区在PHP中有一个叫做“输出缓冲区”“ob”的东西。PHP的输出流包含很多字节,通常由echo语句或printf()函数输出。这些东西的数据需要用到输出缓冲区。一般PHP的输出都是按照上图在buffer之间流动的,但是在cli模式下也有一些比较特殊的。在cli模式的ini配置中,_output_buffer_选项被强制设置为0,_implicit_flush_的值也会被设置为1。output_buffer=0:表示禁用默认的PHP输出缓冲区。所以在cli中,默认情况下,你要输出的东西会直接传给SAPI层,除非你手动调用ob_()类函数。_implicit_flush=1:_implicit_flush_设置为open时(值为1),一旦有任何输出写入到SAPI缓冲层,就会立即被flush(flush,意思是把这些数据写到下层,buffer会被清空).通常,它将是标准输出管道,write()和fflush()两个函数负责执行此操作。关于缓冲区的默认输出缓冲区的配置选项的值将在PHP程序启动时解析,在任何脚本运行之前,因此在脚本启动后使用ini_set()设置它是无效的。为输出内容使用缓冲区有利于Web应用程序环境中的性能。这意味着你可以先写一些字符,然后再和下面的SAPI层通信。并且在web应用环境中,通过socket逐字节传输消息的方式对性能不利。更好的方法是将所有内容一次或至少一段一段地传输到服务器。层之间的数据交换越少,性能越好。对于FastCGI协议,刷新操作(flushing)是在每次写入后发送一个FastCGI数组包(packet)。如果在发送数据包之前填充FastCGI缓冲区会更好。SAPI缓冲区可以使用flush()函数显式刷新。用户输出缓冲区使用ob_start()创建用户输出缓冲区。这些buffer形成一个栈结构,每一个新的buffer都会堆叠在前一个buffer之上,每当它被填满或者溢出时,就会执行flush操作,然后将其中的数据传递给下一个buffer。//web请求立即返回,然后继续在后台执行任务。echojson_encode(['code'=>200]);$size=ob_get_length();header("Content-Length:$size");header('Connection:close');ob_end_flush();ob_flush();fastcgi_finish_request();//flush();//关闭连接后,继续运行php脚本ignore_user_abort(true);//不设置超时时间set_time_limit(0);//继续执行任务关于fastcgi_finish_request()此函数将所有响应数据刷新到客户端并结束请求。客户端结束连接后,服务端可以继续运行耗时任务。fastcgi_finish_request()后,脚本仍会占用一个FPM进程。当前FPM进程会被阻塞,也就是说因为session而要求加锁某个进程的请求会被阻塞,直到session关闭,可以通过session_write_close()主动关闭session。
