ホームページ バックエンド開発 PHPチュートリアル phpのバッファ例を詳しく解説

phpのバッファ例を詳しく解説

Aug 10, 2017 am 11:27 AM
php バッファ

PHP バッファはデフォルトで有効になっており、デフォルトのパラメータは php.ini 設定ファイルにあり、値は 4096 バイトです。その中で、output_buffering 構成パラメーターを見つけて、PHP バッファーのサイズを変更します。

開発者は、ob_start() 関数を使用して、スクリプト内の PHP バッファー メカニズムを手動で処理することもできます。このように、出力コンテンツが構成パラメータのサイズを超えた場合でも、ob_start() が十分な大きさに設定された後でのみ、データはブラウザに送信されません。スクリプトの実行が終了するか、ob_end_flush() 関数が呼び出され、データがブラウザに送信されます。 ob_start()函数手动处理PHP缓冲区机制。这样即便输出内容超过了配置参数的大小,也不会把数据传输给浏览器,ob_start()将PHP缓冲区空间设置到足够大,只有脚本执行结束后或调用ob_end_flush()函数,才会把数据发送给浏览器。

我们编辑php.ini配置文件,对output_buffering值进行修改并做如下测试。当output_buffering修改为4096时,输出较少数据,让它小于一个PHP缓冲区。代码如下:

for ($i = 0; $i< 10; $i++) {    
echo $i . &#39;<br/>&#39;;
    sleep($i + 1);      
    //}
ログイン後にコピー

执行后你会发现,它不会像常规逻辑每隔几秒就有输出,而是直到脚本循环结束后,才会一次性输出。这种情况在脚本处理结束之前,浏览器界面会一直保持空白,这是由于数据量太小,输出缓冲区没有写满。写数据的顺序:echo语句输出到PHP缓冲区、TCP缓冲区、浏览器。

接下来我们再修改output_buffering=0,仍输出较少数据,但实际数据已经大于PHP缓冲区。代码如下:

 for ($i = 0; $i< 10; $i++) {    echo $i . &#39;<br/>&#39;;
    flush();  //通知操作系统底层,尽快把数据发给客户端浏览器
    sleep($i + 1);      //}
ログイン後にコピー

该脚本的结果与刚才一定不一致,因为将缓冲区的容量设置为0,即禁用PHP缓冲区机制。 这时我们会在浏览器看到断断续续的间断性输出,而不必等到脚本执行完毕才看到输出。这是因为,数据没有在输出缓存中停留。写数据的顺序依次是echo输出到TCP缓冲区,再输出给浏览器。 我们再把参数修改为output_buffering=4096,输出数据大于一个缓冲区。此例中不调用ob_start()函数。 准备一个4KB大小的文件或者使用dd命令在shell下创建一个文件:

 $dd if=/dev/zero of=f4096 bs=4096 count=1
ログイン後にコピー

使用如下代码进行验证:

for ($i = 0; $i< 10; $i++) {    
echo file_get_contents(&#39;./f4096&#39;) . $i . &#39;<br/>&#39;;
    sleep($i +1);
    }
ログイン後にコピー

可以看到,程序响应还没结束(HTTP连接并未关闭),就可以看到间断性输出,浏览器界面不会一直保持空白。尽管启用了PHP输出缓冲区机制,但依然会间断性输出,而不是一次性输出,这是因为PHP缓冲区空间不够用,每写满一个缓冲区,数据就会发送到客户端浏览器。

和上例参数一样,即output_buffering=4096,输出数据大于一个PHP缓冲区。这次我们调用ob_start(),代码如下:

ob_start();      
//开启PHP缓冲区
for ($i = 0; $i< 10; $i++) {    
echo file_get_contents(&#39;./f4096&#39;) . $i . &#39;<br/>&#39;;
    sleep($i + 1);
}
ob_end_flush();
ログイン後にコピー

等到服务端脚本全部处理完,响应结束才会看到完整的输出。输出间隔时间很短,以至于感受不到停顿。在输出之前,浏览器一直会保持空白,等待服务器端数据。这是因为,PHP一旦调用了ob_start()函数,就会将PHP缓冲区扩展到足够大,直到ob_end_flush函数调用或者脚本运行结束才发送PHP缓冲区中的数据到客户端浏览器。

ob_start激活output_buffering机制。一旦激活,脚本不再直接输出给浏览器,而是先暂时写入PHP缓冲区。 PHP默认开启output_buffering机制,通过调用ob_start()函数把output_buffering值扩展到足够大。也可以通过$chunk_size来指定output_buffering的值。$chunk_size默认值是0,表示直到脚本运行结束后,PHP缓冲区中的数据才会发送到浏览器。若设置了$chunk_size的大小,则表示只要缓冲区中数据长度达到了该值,就会将缓冲区中的数据发送到浏览器。

可以通过指定$ouput_callback参数来处理PHP缓冲区中的数据,比如函数ob_gzhandler(),将缓冲区中的数据压缩后再传送给浏览器。

ob_get_contents()函数是获取一份PHP缓冲区中的数据拷贝,这是一个重要的函数。请看以下示例:

<?phpob_start();   
?>
<html>
<body>today is <?php echo date(&#39;Y-m-d h:i:s&#39;);  
 ?>
</body>
</html>
<?php
$output = ob_get_contents();
ob_end_flush();echo &#39;<! output>&#39;.$output;?>
ログイン後にコピー

以上脚本运行后,查看源代码,会出现两段相同的HTML,后者就是通过ob_get_contents()函数取得缓冲区里的内容。

ob_end_flush()ob_end_clean()这两个函数都会关闭输出缓冲。

不同的是,ob_end_flush()只是把PHP缓冲区中的数据发送到客户端浏览器,而ob_clean_clean()将PHP缓冲区中的数据删除,但不发送给客户端。

ob_end_flush()调用之后,PHP缓冲区中的数据依然存在,ob_get_contents()

php.ini 設定ファイルを編集し、output_buffering 値を変更して、次のテストを実行します。 output_buffering を 4096 に変更すると、出力されるデータが減り、PHP バッファーよりも小さくなります。コードは次のとおりです。 🎜rrreee🎜 実行後、従来のロジックのように数秒ごとに出力するのではなく、スクリプトループが終了するまで一気に出力することがわかります。この場合、データ量が少なすぎて出力バッファがいっぱいではないため、スクリプトの処理が完了するまでブラウザ インターフェイスは空白のままになります。データの書き込み順序: echo ステートメントは、PHP バッファー、TCP バッファー、ブラウザーに出力されます。 🎜🎜 次に、output_buffering=0 を変更します。これでも出力されるデータは少なくなりますが、実際のデータはすでに PHP バッファーよりも大きくなっています。コードは次のとおりです。 🎜rrreee🎜 バッファ容量が 0 に設定されており、PHP バッファ メカニズムが無効になっているため、このスクリプトの結果は先ほどと一致しないはずです。 現時点では、スクリプトが実行されて出力が表示されるまで待つ必要がなく、ブラウザーに断続的な出力が表示されます。これは、データが出力キャッシュに残らないためです。データの書き込み順序は、TCP バッファにエコーが出力され、ブラウザに出力されます。 次に、パラメーターをoutput_buffering=4096に変更すると、出力データは1つのバッファーよりも大きくなります。この例では、ob_start() 関数は呼び出されません。 4KB ファイルを準備するか、dd コマンドを使用してシェルの下にファイルを作成します: 🎜rrreee🎜 次のコードを使用して確認します: 🎜rrreee🎜 プログラムの応答が終了していない (HTTP 接続が閉じられていない) ことがわかります。断続的な出力では、ブラウザ インターフェイスが常に空白のままになるわけではありません。 PHP 出力バッファー メカニズムが有効になっているにもかかわらず、1 回限りの出力ではなく断続的な出力が行われます。これは、PHP バッファーのスペースが不足するたびに、データがクライアント ブラウザーに送信されるためです。 🎜🎜上記の例と同じパラメータ、つまり output_buffering=4096 では、出力データは 1 つの PHP バッファよりも大きくなります。今回は ob_start() を呼び出します。コードは次のとおりです: 🎜rrreee🎜 サーバー スクリプトが完全に処理され、応答が終了するまで、完全な出力は表示されません。出力間の間隔が非常に短く、一時停止を感じません。出力する前に、ブラウザは空白のままになり、サーバー側のデータを待ちます。これは、PHP が ob_start() 関数を呼び出すと、PHP バッファが十分なサイズに拡張され、ob_end_flush 関数が呼び出されるまで送信されないためです。呼び出されるか、クライアントブラウザへのスクリプト領域が終了します。 🎜🎜ob_start は、output_buffering メカニズムをアクティブにします。アクティブ化されると、スクリプトはブラウザに直接出力されなくなり、最初に一時的に PHP バッファに書き込まれます。 PHP はデフォルトで output_buffering メカニズムを有効にし、ob_start() 関数を呼び出して output_buffering 値を十分な大きさの値に拡張します。 $chunk_size を通じて output_buffering の値を指定することもできます。 $chunk_size のデフォルト値は 0 です。これは、スクリプトの実行が終了するまで、PHP バッファー内のデータがブラウザーに送信されないことを意味します。 $chunk_size のサイズが設定されている場合、バッファ内のデータ長がこの値に達する限り、バッファ内のデータがブラウザに送信されることを意味します。 🎜🎜関数 ob_gzhandler() などの $ouput_callback パラメータを指定することで、PHP バッファ内のデータを処理できます。これにより、送信前にバッファ内のデータが圧縮されます。ブラウザに。 🎜🎜ob_get_contents() 関数は、PHP バッファー内のデータのコピーを取得します。これは重要な関数です。次の例を参照してください: 🎜rrreee🎜 上記のスクリプトを実行した後、ソース コードを確認すると、2 つの同一の HTML が表示されます。後者は、ob_get_contents() を通じてバッファーの内容を取得します。コード>関数。 🎜🎜<code>ob_end_flush()ob_end_clean() の両方の関数は出力バッファをオフにします。 🎜🎜 違いは、 ob_end_flush() は PHP バッファ内のデータをクライアント ブラウザに送信するだけであるのに対し、 ob_clean_clean() は PHP バッファ内のデータを削除しますが、削除はしないことです。クライアントに送信されました。 🎜🎜 ob_end_flush() が呼び出された後も、PHP バッファー内のデータはまだ存在しており、ob_get_contents() は引き続き PHP バッファー内のデータのコピーを取得できます。 🎜

以上が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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPの永続的な関連性:それはまだ生きていますか? PHPの永続的な関連性:それはまだ生きていますか? Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

See all articles