ホームページ >バックエンド開発 >PHPの問題 >PHPでバッファを閉じる方法

PHPでバッファを閉じる方法

青灯夜游
青灯夜游オリジナル
2021-09-28 19:08:142654ブラウズ

php でバッファを閉じる方法: 1. PHP インストール ディレクトリを開き、設定ファイル「php.ini」を見つけて開きます; 2. 設定ファイル内で「output_buffering」項目を見つけ、この項目の値を「Off」に設定するだけです。

PHPでバッファを閉じる方法

このチュートリアルの動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター

PHP バッファ( バッファ)

スクリプトの出力情報は最初にバッファに入れられ、バッファがいっぱいになるかスクリプトの実行が終了した場合にのみ、データが次のステージに転送されます。設定ファイル php.ini に output_buffering 設定項目があります。私のデフォルト設定 (Windows/XAMPP v3.2.2) は 4096

PHPでバッファを閉じる方法

If On に設定すると、バッファは使用可能でサイズ制限はありません。

Off に設定すると、バッファは使用できなくなります。

#設定した場合整数にバッファを指定します 領域は利用可能であり、設定されたサイズです (バイト単位)

ini_set ではバッファ サイズを設定できないことに注意してください。スクリプト実行環境の初期化時に、バッファは定義されています。 cli モードでは、デフォルトの Output_buffering は Off です。

それでは、バッファを閉じることと開くことの違いは何でしょうか?初期バッファサイズは何をするのでしょうか? cli モードはデフォルトでオフになっていますが、ビジネスで必要な場合にオンにすることはできますか?キャッシュ領域の利点は何ですか?

1. バッファを閉じることと開くことの違いは何ですか?

パスコード検査

output_buffering が 4096 に設定されている場合、コードを実行します

出力結果: 3 を待った後秒、出力の開始と終了は同時に行われます。

Output_buffering が Off に設定されている場合、同じコードを実行します。

出力結果: start が最初に出力され、3 秒待った後に end が出力されます。

## が出力されます #これだけ見ると結果は全く同じですね~ しかし、その動作過程を観察してみると、意外な違いが分かりました。バッファリングがオフの場合は、最初に「start」が出力され、次に 3 秒待ってから「end」が出力されます。バッファーがオンになると、スクリプトの実行が完了するまで待機し、結果をまとめて出力します。

この例では、PHP バッファーが直接接続を確立できるようにするのと同様に、フラッシュを使用して Apache バッファーをリフレッシュします。ブラウザとの接続により、PHP バッファ自体に注意を集中できるようになります。

わかりやすい例で説明すると、PHP のバッファは大きな家のようなもので、echo などの出力関数が実行されるたびに、スクリプトの実行が完了するか ob_flush 関数が実行されるまで、データがこの大きな家の中に放り込まれます。 . データは大きな家から解放され、WebServer のバッファにスローされます。 PHP バッファを閉じた後、echo 関数が実行されますが、それを置く大きな家がない場合はどうすればよいでしょうか? WebServer バッファに直接渡す必要があります。

例とコードの実行結果を通じて、いわゆる PHP バッファーは PHP 自体によって開発されたデータ ストレージ ハブであり、一連の ob 関数がこの目的のために動作することがわかります。 (関数の例をいくつか挙げます)

ob_clean(); // 内部バッファの内容を削除します。バッファは閉じません (出力なし)。

ob_end_clean(); //内部バッファの内容を削除し、バッファを閉じます(出力なし)。

ob_get_contents(); //バッファの内容を返します。出力はしません

ob_get_length(); //内部バッファの長さを返します。バッファがアクティブ化されていない場合、これは関数は FALSE を返します。

2. 初期バッファ サイズの役割は何ですか?

テストの実行を容易にするために、output_buffering を 4096 から 5 に変更します

実行コード

出力の説明: 3 秒待機した後、出力 1234end

実行コード

出力の説明: 出力 12345、3 秒待機、出力終了

出力の比較により, 違いをわかりやすく解説しています。

バッファには 5 バイトのデータしか保持できません。データが最大値未満の場合は、最初に保存できます。臨界値以上の場合は、データを保存する必要があります。これは、ob_flush 関数のエフェクトを手動で実行したのと同じです。

3. cli モードはデフォルトでオフになっていますが、ビジネスで必要な場合にオンにすることはできますか?

この質問は補足できます。非 cli モードで、php.ini がバッファを閉じるように設定しているのに、ビジネスでバッファを使用する必要がある場合、どうすればよいですか?構成を変更しますか?もちろん、それほど難しいことではありません。このとき、別の ob 関数が来ます,

ob_start(); //出力バッファを開きます。すべての出力情報はブラウザに直接送信されるのではなく、保存されます。出力バッファ内。

PHP バッファーが一時データ保存領域の概念に似ていることがわかったので、TP5 ソース コードに戻って見てみましょう。

まず、ob_get_level 関数と ob_get_clean 関数の説明を見てみましょう。

ob_get_level(): 出力バッファリング メカニズムのネスト レベルを返します。

ob_get_clean(): 現在のバッファの内容を取得し、現在の出力バッファを削除します。

コードから 1 つまたは 2 つのことを学ぶこともできます。レベルが 0 より大きい場合は、バッファーの内容を取得してバッファーを削除し、ob_start を通じて新しいバッファーを開きます。これもコメントの指示に従っています。「再適用」。

ここではいわゆるネスティングについて説明しますが、level の値がいつ 0 になるのか、0 以外の場合はどうなるのかについては、php.ini の Output_buffering をオフにして出力して結果を確認してください。 。さらに、ob_startを複数回、ob_get_levelを複数回実行して、出力結果を比較してみます。

最初に 2 つのモデルを見てみましょう


##ob_start が新しいバッファを複数回開くと、データ構造は 2 番目のタイプ (ネスト) として構築されます。 ob_get_level はネストされたレベルを返します。

私の個人的な理解では、ネストは Java のストリーム メカニズムに似ており、あるバッファー内のデータが次のバッファーに出力され、そのデータに対してカスタマイズされた操作を実行できます。

TP5 のソース コードを見ると、考え方がより明確になります。システムがバッファを初期化する場合は、サイズが制限されている可能性があるため、最初にバッファを削除してから再度開きます。 ob_startを実行してオープンされるキャッシュ領域のサイズは「十分な大きさ」ですが、それがどのくらいの大きさなのかについては具体的な説明がなく、書き込んだデータがどんなに大きくても最後まで送信されないということだけが分かります。スクリプト

4. キャッシュ領域の利点は何ですか?

PHP の出力データは WebServer に送信されますが、echo を一度実行して送信するとリソースの消費が大きくなりますので、メモリに格納して一律に送信した方が効率的です。

Web リクエストには HTTP ヘッダーが含まれており、ヘッダーが設定される前に出力があってはなりません。 PHP バッファはこの作業を行い、ヘッダーを送信する前にさまざまなデータを出力し、最初にヘッダー情報を WebSever に送信し、次にデータ パケットを均一に送信します。

推奨学習: 「

PHP ビデオ チュートリアル

以上がPHPでバッファを閉じる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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