ホームページ  >  記事  >  バックエンド開発  >  PHPのflush()とob_flush()の違いの詳しい説明_PHPチュートリアル

PHPのflush()とob_flush()の違いの詳しい説明_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:09:10972ブラウズ

buffer ---- flush()
 
buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入 一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁 盘,当然当调用内核函数flush()的时候,强制要求把buffer中的脏数据写回磁盘。
同样的道理,当执行echo,print的时候,输出并没有立即通过tcp传给客户端浏览器显示, 而是将数据写入php buffer。php output_buffering机制,意味在tcp buffer之前,建立了一新的队列,数据必须经过该队列。当一个php buffer写满的时候,脚本进程会将php buffer中的输出数据交给系统内核交由tcp传给浏览器显示。所以,数据会依次写到这几个地方echo/pring -> php buffer -> tcp buffer -> browser

php output_buffering --- ob_flush()

默认情况下,php buffer是开启的,而且该buffer默认值是4096,即1kb。你可以通过在php.ini配置文件中找到output_buffering配置.当echo,print等输出用户数据的时候,输出数据都会写入到php output_buffering中,直到output_buffering写满,会将这些数据通过tcp传送给浏览器显示。你也可以通过 ob_start()手动激活php output_buffering机制,使得即便输出超过了1kb数据,也不真的把数据交给tcp传给浏览器,因为ob_start()将php buffer空间设置到了足够大 。只有直到脚本结束,或者调用ob_end_flush函数,才会把数据发送给客户端浏览器。

这两个函数的使用怕是很多人最迷惑的一个问题,手册上对两个函数的解释也语焉不详,没有明确的指出它们的区别,似乎二者的功能都是刷新输出缓存。但在我们文章一开始的代码中如果讲fush()替换成ob_flush(),程序就再不能正确执行了。显然,它们是有区别的,否则也手册中直接说明其中一个是另外一个函数的别名即可了,没必要分别说明。那么它们的区别到底是什么呢?

在没有开启缓存时,脚本输出的内容都在服务器端处于等待输出的状态 ,flush()可以将等待输出的内容立即发送到客户端。

开启缓存后,脚本输出的内容存入了输出缓存中 ,这时没有处于等待输出状态的内容,你直接使用flush()不会向客户端发出任何内容。而 ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端 ,这时你就需要先使用 ob_flush()再使用flush(),客户端才能立即获得脚本的输出。

1. フラッシュと ob_flush の正しい順序は、次のように最初に ob_flush、次にフラッシュする必要があります:
ob_flush();
flush();
Web サーバーのオペレーティング システムが Windows の場合システムの場合、順序が逆であっても、ob_flush() が使用されなくても問題は発生しません。 [要検証] ただし、Linux システムでは出力バッファを更新できません。

出力バッファリング関数
1.bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
Output_buffering メカニズムをアクティブにします。アクティブ化すると、スクリプト出力はブラウザに直接送信されなくなり、一時的に PHP バッファ メモリ領域に書き込まれます。
phpはデフォルトでoutput_bufferingメカニズムを有効にしますが、ob_start()関数を呼び出すことにより、データのoutput_buffering値が十分に大きな値に拡張されます。 $chunk_size を指定して、output_buffering の値を指定することもできます。 $chunk_size のデフォルト値は 0 です。これは、スクリプトが終了するまで php バッファー内のデータがブラウザーに送信されないことを意味します。 $chunk_size のサイズを設定すると、バッファ内のデータ長がこの値に達する限り、バッファ内のデータがブラウザに送信されることを意味します。
もちろん、$ouput_callbackを指定することでバッファ内のデータを処理することもできます。たとえば、関数 ob_gzhandler はバッファ内のデータを圧縮してブラウザに送信します。
3 番目のパラメータ: キャッシュをクリアするかどうか。オプション。デフォルトは true です。false に設定すると、スクリプトの実行が終了する前にキャッシュはクリアされません。
2.ob_get_contents
PHP バッファ内のデータのコピーを取得します。 ob_end_clean() 関数が呼び出される前にこの関数を呼び出す必要があることに注意してください。そうしないと、ob_get_contents() は null 文字を返します。

ob_get_contents() を使用すると、サーバーによってキャッシュされたデータを文字列の形式で取得できます。
ob_end_flush() を使用すると、キャッシュされたデータが出力され、キャッシュが閉じられます。
ob_end_clean() を使用すると、データやその他のアクションを行わずに、サーバーにキャッシュされたデータがサイレントに消去されます。
サーバー上のキャッシュはスタックされています。つまり、ob_start() を有効にした後、それを閉じる前に、その中にある別のキャッシュ ob_start() を開くことができます。

ただし、キャッシュをオフにする操作の数が、キャッシュをオンにする操作の数と同じであることも確認する必要があります。
ob_start() は、キャッシュされたデータを処理するコールバック関数を指定できます。1 つの ob_start() が別の ob_start() 内にネストされている場合、外側の ob_start() の番号は A、内側の ob_start() の番号は B であると想定されます。それぞれに functionA と functionB というコールバック関数があり、キャッシュ B 内のデータが出力されると、最初に funcitonB コールバック関数によって処理され、その後、外側の functionA コールバック関数に渡されて処理され、出力することができます。クライアントへ。

さらに、マニュアルには、Apache などの一部の Web サーバーでは、コールバック関数を使用すると、プログラムの現在の作業ディレクトリが変更される可能性があると記載されています。解決策は、chdir を使用して、コールバック関数で作業ディレクトリを手動で変更することです。このドットは頻繁に発生するものではないようなので、遭遇した場合は必ずマニュアルを確認してください。

3. ob_end_flush と ob_end_clean
これら 2 つの関数は似ており、両方とも ouptu_buffering メカニズムをオフにします。ただし、違いは、ob_end_flush は php バッファー内のデータをクライアント ブラウザーにフラッシュ (フラッシュ/送信) するだけですが、ob_clean_clean は php バッファー内のデータをクリア (消去) しますが、クライアント ブラウザーには送信しないことです。

ob_end_flush が呼び出される前、php バッファー内のデータはまだ存在しており、ob_get_contents() は引き続き php バッファー内のデータのコピーを取得できます。

ob_end_flush() を呼び出した後、 ob_get_contents() は空の文字列を取得し、ブラウザは出力を受け取ることができません。つまり、出力はありません。

ob_get_contents() を使用してサーバー側のキャッシュ データを文字列形式で取得し、ob_end_flush() を使用してキャッシュ データを出力し、キャッシュを閉じることができます。
ob_end_clean() を使用すると、データやその他のアクションを行わずに、サーバーにキャッシュされたデータがサイレントに消去されます。
サーバー側のキャッシュはスタックされています。つまり、ob_start() を有効にした後、それを閉じる前に、その中にある別のキャッシュ ob_start() を開くことができます。ただし、キャッシュをオンにする操作と同じ数のキャッシュをオフにする操作があることも確認する必要があります。
ob_start() は、キャッシュされたデータを処理するコールバック関数を指定できます。1 つの ob_start() が別の ob_start() 内にネストされている場合、外側の ob_start() の番号は A、内側の ob_start() の番号は B であると想定されます。 functionA と functionB というコールバック関数があり、キャッシュ B 内のデータが出力されると、最初に funcitonB コールバック関数によって処理され、次に外側の functionA コールバック関数に渡されて処理され、次に出力できます。クライアント側。

さらに、マニュアルには、Apache などの一部の Web サーバーでは、コールバック関数を使用すると、プログラムの現在の作業ディレクトリが変更される可能性があると記載されています。解決策は、chdir を使用して、コールバック関数で作業ディレクトリを手動で変更することです。このドットは頻繁に発生するものではないようなので、遭遇した場合は必ずマニュアルを確認してください。

www.bkjia.com本当http://www.bkjia.com/PHPjc/327388.html技術記事バッファ ---- flash() バッファはメモリ アドレス空間で、Linux システムのデフォルト サイズは通常 4096 (1kb) で、これは 1 メモリ ページです。主に、ストレージ速度が同期していないデバイスや優先順位が異なるデバイスに使用されます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。