乐趣区

PHP的输出缓冲区

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);
    继续执行工作

退出移动版