ホームページ バックエンド開発 PHPチュートリアル PHP出力バッファ制御の詳細説明

PHP出力バッファ制御の詳細説明

Jun 01, 2018 pm 02:47 PM
php コントロール 詳しい説明

この記事では、主に PHP 出力バッファリング制御について説明します。詳細な関連情報と簡単なサンプル コードは、興味のある友人が参照できるようにここに提供されています。

php バッファリングの概要

php obシリーズ 普段カードをやっているのですが、まだプレイ方法がよくわかっていません。 phperとしてとても恥ずかしいです。ネットで検索して相互にコピーした結果、コードを実行すると著者が説明した現象は発生しません この記事は良心的な製品であり、コードは著者によって実行されています。

echo、printなどの出力を実行する場合。出力はすぐには Web サーバーに送信されませんが、データは PHP バッファーに書き込まれます。 phpのoutput_bufferingメカニズムの利点により、パフォーマンスは確実に向上します。実際、php ファイルは最終的にブラウザ上に表示され、php バッファ=》Web サーバー バッファ=》ブラウザ バッファという 3 つのバッファリング段階を経ます。 最後にブラウザに表示されました

デフォルトではphpバッファがオンになっており、バッファのデフォルト値は4096、つまり4kbです。 Output_buffering 設定は php.ini 設定ファイルにあります。バッファはメモリ アドレス空間であり、Linux システムのデフォルト サイズは通常 4096 (4kb) で、これは 1 メモリ ページです。主に、速度が同期していないデバイスや優先度が異なるデバイス間のデータ転送領域を格納するために使用されます。バッファーを介して、プロセスは相互に待機する時間を減らすことができます。次に、より一般的な例を示します。ファイルを編集するためにテキスト エディタを開いた場合、文字を入力するたびに、オペレーティング システムはその文字をすぐにディスクに直接書き込むのではなく、書き込み時に最初にその文字をバッファに書き込みます。バッファがいっぱいの場合、バッファ内のデータはディスクに書き込まれます。もちろん、カーネル関数 flash() が呼び出されるときは、バッファ内のダーティ データをディスクに書き戻す必要があります。

たとえば、

<?php
echo "南无阿弥陀佛<br>";
header("content-type:text/html;charset=&#39;utf-8&#39;");
echo "真善忍好!";
//output
//南无阿弥陀佛
//真善忍好
ログイン後にコピー

header()は、実際の出力の前に呼び出す必要がありますが、プログラムはすでに出力されていますが、正常に実行されます。次のコードを見ると:

<?phpecho "南无阿弥陀佛<br>";
ob_flush();
header("content-type:text/html;charset=&#39;utf-8&#39;");
echo "真善忍好!";
//output
//南无阿弥陀佛
//Cannot modify header information - headers already sent by (output started at E:\php\test.php:3)
//真善忍好
ログイン後にコピー

上記のプログラムは、プログラムがすぐには出力せず、ob_flush 関数が呼び出されたときにのみバッファーをリフレッシュして出力することを示しています。

ob_flush() と flash()

ob_flush() と flash() 関数については、PHP マニュアルで詳しく説明されていますので、確認してください。 2 つの違いは次のとおりです。

ob_flush() は PHP 自体のバッファをリフレッシュします。

flush() は WebServer サーバーのバッファをリフレッシュします。ブラウザに出力します。 しかし、次の状況が発生します:

  1. 個々の Web サーバー プログラム、特に Win32 での Web サーバー プログラムは、結果をブラウザーに送信する前に、プログラムの終了までスクリプトの出力をキャッシュします。

  2. mod_gzip などの一部の Apache モジュールは、独自の出力をキャッシュする場合があるため、flush() 関数によって生成された結果がクライアントのブラウザーにすぐに送信されなくなります。

  3. ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは、改行または HTML タグの先頭を受け取るまでコンテンツをキャッシュし、 タグを受け取るまでテーブル全体を表示しません。

  4. Microsoft Internet Explorer の一部のバージョンは、256 バイトを受信した後にのみページの表示を開始するため、これらのブラウザーがページのコンテンツを表示できるようにするには、追加のスペースを送信する必要があります。

例:

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo &#39;佛法无边&#39;."<BR>";
ob_flush();
flush();
sleep(1);
echo &#39;法轮常转&#39;;

//output
ログイン後にコピー

上記のコードは、Chrome ブラウザでは 1 行ずつ出力されますが、IE シリーズ ブラウザではすべて出力されます。実際、これは上の 4 番目の項目です。一部のブラウザでは、256 文字を受信した場合にのみ表示が開始されます。上記のコードを次の形式に変更します:

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo str_pad(&#39;&#39;,240)."\n"; 
echo &#39;佛法无边&#39;."<BR>";
ob_flush();
flush();
sleep(1);
echo &#39;法轮常转&#39;;

//output
ログイン後にコピー

このようにすると、256 文字を超えるため、IE では 1 行ずつ出力されます。

ob その他の関数の説明

1. ob_end_flush と ob_end_clean

名前が示すように、end はバッファを閉じ、どちらも出力バッファを閉じます。1 つは出力バッファ、もう 1 つはクリアです。たとえば、

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo &#39;before&#39;;
ob_end_clean();
echo str_pad(&#39;&#39;,4096)."\n";
for ($i=10; $i>0; $i--) 
{ 
 echo $i;
 sleep(1);
}
ログイン後にコピー

上記のコードは、コンテンツを 1 つずつ出力するのではなく、一度に全体を出力します。 ob_end_clean() はバッファをオフにしませんか?それらを 1 つずつ出力しないのはなぜでしょうか? 実際、上で述べたように、php はブラウザーに直接出力されるのではなく、Web サーバーに出力されます。 phpにはバッファがありませんが。ただし、Web サーバーはまだ存在します。したがって、次のコード:

/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo &#39;before&#39;;
ob_end_clean();
echo str_pad(&#39;&#39;,4096)."\n";
for ($i=10; $i>0; $i--) 
{ 
 flush();
 echo $i;
 sleep(1);
}
ログイン後にコピー

にflush()を追加すると、行ごとに出力されます。 ob_end_clean を ob_end_flush に置き換えると、 before が出力されます。

その他の機能はマニュアルを参照でき、比較的簡単です。

まとめ

PHPスクリプトからブラウザへは、PHPバッファ=》Webサーバーバッファ=》ブラウザバッファを経由する必要があります。 最後にブラウザに表示されました。 不可欠です。 したがって、必要なエフェクトをデバッグするには、ob_flush と flash を追加し、echo str_pad('',4096) を追加する必要があります。

要約: 以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。

関連する推奨事項:

PHPで実装されたログイン、登録、パスワード変更機能

PHPの匿名関数の詳しい解説と注意点

PHPでのcall_user_func_arrayコールバック関数の使い方

以上がPHP出力バッファ制御の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP データベースの操作 CakePHP データベースの操作 Sep 10, 2024 pm 05:25 PM

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

CakePHP のロギング CakePHP のロギング Sep 10, 2024 pm 05:26 PM

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

See all articles