ホームページ  >  記事  >  バックエンド開発  >  PHPでバッファをクリアするにはどうすればよいですか?

PHPでバッファをクリアするにはどうすればよいですか?

青灯夜游
青灯夜游オリジナル
2020-08-25 11:54:065095ブラウズ

php でバッファをクリアする方法: 1. "ob_clean()" 関数を使用して php バッファの内容をクリアします; 2. "ob_end_clean()" 関数を使用して php バッファをクリアします。バッファの内容を確認し、出力バッファを閉じます。

PHPでバッファをクリアするにはどうすればよいですか?

#推奨: 「

PHP ビデオ チュートリアル

バッファをクリアするための php メソッド

##方法 1: ob_end_clean

ob_end_clean - バッファをクリア (消去) し、出力バッファを閉じます

構文:

ob_end_clean ( void ) : bool

この関数は、最上位の出力バッファの内容を破棄し、このバッファを閉じます。バッファの内容をさらに処理したい場合は、ob_end_clean() を呼び出すとバッファの内容が破棄されるため、ob_end_clean() の前に ob_get_contents() を呼び出す必要があります。

戻り値

成功した場合は TRUE を返し、失敗した場合は FALSE を返します。エラーの最初の理由は、呼び出し時にアクティブなバッファーがないか、何らかの理由でバッファー (おそらく特殊なバッファーの場合) を削除できないことです。

方法 2: ob_clean() を使用します

ob_clean - 出力バッファをクリア (消去)

手順

ob_clean ( void ) : void

この関数出力バッファの内容を破棄するために使用されます。

この関数は、ob_end_clean() 関数のように出力バッファを破壊しません。

出力バッファリングは、ob_start() によって PHP_OUTPUT_HANDLER_CLEANABLE フラグを指定して開始されている必要があります。それ以外の場合、ob_clean() は効果がありません。

戻り値

戻り値はありません。

知識を広げる

バッファとは何ですか?

簡単に言えば、次の機能です。バッファとは、入力または出力の内容を、表示したり読み取ったりせずに、まずメモリに入れることです。なぜバッファがあるのか​​については、これは非常に幅広い質問です。興味があれば、インターネットで情報を見つけることができます。

実際、バッファの最も重要な役割は、高速 CPU と比較的遅い IO デバイス (ディスクなど) の動作を調整することです。

バッファはどのような場合に役立ちますかPHP を実行しますか? バッファへ?

PHP のバッファを理解したい場合は、PHP を実行するときにバッファがどこに設定されているかを知る必要があります。

PHP を実行するとき、 if echo print_r などのデータを出力するコードに遭遇すると、PHP は出力するデータを PHP 自身のバッファに入れて出力を待ちます。バッファの内容を指定すると、バッファ内のデータが Apache に出力されます Apache は PHP が出力したデータを受け取り、Apache 自身のバッファにデータを格納し、出力されるまで待ちます

Apache が命令を受け取るとバッファの内容のみを出力したい場合は、バッファの内容を出力してブラウザに返します。出力データをPHP自身のバッファに入れて出力を待つ---->(出力バッファの内容を受け取る) データをApacheに出力し、Apache自身のバッファに格納する---->(出力指定を受け取る)バッファの内容を出力してブラウザに返す

echo、print => php output_buffering => webServer buffer => browser buff => browser display

つまり: スクリプトの出力 => PHP バッファ設定 => システム バッファ設定 (apache、nginx) => サーバーのバッファ設定を参照 = > ユーザーへの表示

PHP がデータを出力したいとき、2 つのバッファ (最初は独自のバッファ、次に Apache のバッファ) を通過してからブラウザに戻ることがわかります

PHP でバッファーはどのような役割を果たしますか?

1. 最も一般的なのは、ヘッダー関数を使用する前にデータが出力されていることです。これにより、「変更できません」などの特定のエラーが発生します。ヘッダー情報 – ヘッダーはすでに送信されています;

echo "this is test";
header("LOCATION http://www.baidu.com");

このエラーの理由は、ヘッダーの前にいくつかのデータが出力されており、このデータの出力中に Apache の応答ステータスが同時にブラウザーに送信されるためです。 (出力があるため、つまりリクエストが有効であるため) その後、ヘッダー関数 を再度使用して http ヘッダーを送信すると、このエラーが返されます。

バッファを使用するとこのエラーを回避できるのはなぜですか?

ヘッダ関数はバッファの影響を受けないため、ヘッダ関数が発生した場合ははい、 , PHP はすぐに Apache を実行して、この http ヘッダーをブラウザに送信します。

And the Output data will be storage in thebuffer after PHP opens the Output Buffer. Wait for the Output. この方法で、

#2. PHP でファイルダウンロードプログラムを作成する場合 ((例) PHP の HTTP ブレークポイント再開転送の実装方法の原理)

ファイルのダウンロードを行うにはより安全であると同時に、より制御性が向上するため、多くの友人は PHP を使用してファイル ダウンロード ページを作成することを好みます。原理は非常に単純です。fwrite を通じてファイルの内容を読み取って表示し、ヘッダーを使用して HTTP ヘッダーを送信します。これはブラウザにこれが添付ファイルであることを知らせ、ダウンロード効果を実現します。

如果用上面的办法提供下载页面,会碰到一个效率问题,如果一个文件很大,假设为100M,那么在不开启缓冲区输出的情况下,必须要把100M数据全部读出,然后一次返回到页面上,如果这样做,用户将会在所有数据读完之后才会得到响应,降低了用户体验感.

如果开启了输出缓冲区,当PHP程序读完文件的某一段,然后马上输出到apache,然后让apache马上返回到浏览器,这样就可以减少用户等待时间.那后面的数据怎么办呢?我们可以写一个while循环,一直一段一段地读取文件每读一段,就马上输出,直到把文件全部输出为止,这样浏览器就可以持续地接受到数据,而不必等到所有文件读取完毕. 另外,该做法还解决了另外一个很严重的问题.例如一个文件是100M,如果不开启缓冲区的情况下,则需要把100M文件全部读入内存,然后再输出.但是,如果PHP程序做了内存限制呢?为了保证服务器的稳定,管理员通常会把PHP的执行

内存设一个限制(通过php.ini总的memory_limit, 其默认值是8M), 也就是每个PHP程序使用的内存不能使用超过这个值的内存. 假设该值为8M,而要读入的文件是100M,根本就没有足够的内存来读入该文件.这个时候,我们就需要用到上面的

办法来解决这个问题,每次只读某一段,这样就可以避免了内存的限制

3、静态文件缓存

现在很多公司有这么一个需求, 就是某一个页面在第一次访问的时候,会执行PHP,然后把显示的内容返回到浏览器,同时需要把这次显示的内容保存到服务器上,这样下次访问的时候,就直接把保存在服务器上的文件直接显示,而不需要通过PHP来做操作这就是所谓的”静态页面缓存”.那怎么样才能做到把内容返回到浏览器的同时把数据保存到服务器上呢?这就要用到输出缓冲区了.

ob_start();
echo 'aaa';
$string = ob_get_contents();
file_put_contents('a.html', $string);
ob_flush();
flush();

与输出缓冲区有关的配置

在PHP.INI中,有两个跟缓冲区紧密相关的配置项

1.output_buffering

该配置直接影响的是php本身的缓冲区,有3种配置参数.on/off/xK(x为某个整型数值);

  • on    - 开启缓冲区

  • off    - 关闭缓冲区

256k    - 开启缓冲区,而且当缓冲区的内容超过256k的时候,自动刷新缓冲区(把数据发送到apache);

2.implicit_flush

该配置直接影响apache的缓冲区,有2种配置参数. on/off

  • on - 自动刷新apache缓冲区,也就是,当php发送数据到apache的缓冲区的时候,不需要等待其他指令,直接就把输出返回到浏览器

  • off - 不自动刷新apache缓冲区,接受到数据后,等待刷新指令

与缓冲区有关的函数

1.ob_implicit_flush

作用和implicit_flush一样,是否自动刷新apache的缓冲区

2.flush

作用是发送指令到apache,让apache刷新自身的输出缓冲区.

3.ob_start

打开输出缓冲区,无论php.ini的文件如何配置,如果使用该函数,即使output_buffering设置成off,也会打开输出缓冲区

ob_start函数还接受一个参数,该参数是一个函数的回调,意思是,在输入缓冲区内容之前,需要使用调用传递进来的参数把缓冲区的内容处理一次,再放入缓冲区内

4.ob_flush

指示php本身刷新自身的缓冲区,把数据发送到apache

5.ob_clean

清除php缓冲区里面的内容

6.ob_end_clean

清除php缓冲区内的内容,并且关闭输出缓冲区

7.ob_end_flush

把php自身的缓冲区里的内容发送到apache,并把清除自身缓冲区内的内容

8.ob_get_clean

获取缓冲区的内容之后,清除缓冲区.

9.ob_get_contents

获取输出缓冲区里的内容

10.ob_get_flush

获取缓冲区里的内容,并且把这些内容发送到apache

11.ob_get_length

获取缓冲区里内容的长度

12.ob_list_handlers

获取运行ob_start时,所回调的函数名称, 例如:

ob_start(‘ob_gzhandler’);

print_r(ob_list_handlers);

将打印出ob_gzhandler;

13.ob_gzhandler

该函数的作用是作为ob_start的回调参数, 在缓冲区刷新之前,会调用该函数对数据进行到底gzip或者deflate压缩.这个函数需要zlib扩展的支持.

以上がPHPでバッファをクリアするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。