PHP的输入缓冲区

在PHP中有一个名为“输入缓冲区”「ob」的货色。PHP的输入流蕴含很多字节,通常是echo语句或者printf()函数输入的。这些货色的数据须要用到输入缓冲区。

个别PHP的输入就是依照下面这张图在各个缓冲区间流转,然而cli模式下有些非凡。在cli模式下ini的配置中_output_buffer_选项强制设置为0、_implicit_flush_的值也会被设置为1。

  • output_buffer=0: 示意禁用默认PHP输入缓冲区。所以在cli中国呢,默认状况下你要输入的货色会间接传递到SAPI层,除非你手动调用ob_()类函数。
  • _implicit_flush=1: _当_implicit_flush_被设置为关上(值为1),一旦有任何输入写入到SAPI缓冲区层,它都会立刻刷新(flush,意思是把这些数据写入到更低层,并且缓冲区会被清空)。个别会是规范输入管道,write()和fflush()这两个函数就是负责干这个事件的。
    • 默认输入缓冲区

      对于缓冲区的配置选项的值会在PHP程序启动的时候,还没有运行任何脚本之前解析,所以在脚本启动之后应用ini_set()去设置是没有成果的。

      在web应用环境中对输入的内容应用缓冲区对性能有益处。这意味着你能够先写入一些字符,而后再跟上面的SAPI层通信。并且在web应用环境中,通过socket一个字节一个字节的传输音讯的形式对性能并不好。更好的形式是把所有内容一次性传输给服务器,或者至多是一块一块地传输。层与层之间的数据交换的次数越少,性能越好。

      对于FastCGI协定,刷新操作(flushing)是每次写入后都发送一个FastCGI数组包(packet),如果发送数据包之前先把FastCGI的缓冲区写满会更好一些。

      能够应用flush()函数显式刷新SAPI缓冲区。

      用户输入缓冲区

      应用ob_start()创立用户输入缓冲区。这些缓冲区组成一个堆栈构造,每个新建缓冲区都会重叠到之前的缓冲区上,每当它被填满或者溢出,都会执行刷新操作,而后把其中的数据传递给下一个缓冲区。

       web申请立刻返回,而后后盾继续执行工作。echo json_encode(['code' => 200]);$size = ob_get_length();header("Content-Length: $size");header('Connection: close');ob_end_flush();ob_flush();flush();在敞开连贯后,持续运行php脚本ignore_user_abort(true); 不设置超时工夫set_time_limit(0); 继续执行工作