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 . '<br/>'; sleep($i + 1); //}
执行后你会发现,它不会像常规逻辑每隔几秒就有输出,而是直到脚本循环结束后,才会一次性输出。这种情况在脚本处理结束之前,浏览器界面会一直保持空白,这是由于数据量太小,输出缓冲区没有写满。写数据的顺序:echo语句输出到PHP缓冲区、TCP缓冲区、浏览器。
接下来我们再修改output_buffering=0,仍输出较少数据,但实际数据已经大于PHP缓冲区。代码如下:
for ($i = 0; $i< 10; $i++) { echo $i . '<br/>'; 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('./f4096') . $i . '<br/>'; 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('./f4096') . $i . '<br/>'; 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('Y-m-d h:i:s'); ?> </body> </html> <?php $output = ob_get_contents(); ob_end_flush();echo '<! output>'.$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()
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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用して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で後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

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

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

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

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

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