ホームページ  >  記事  >  バックエンド開発  >  PHP出力制御

PHP出力制御

巴扎黑
巴扎黑オリジナル
2016-11-11 10:04:101137ブラウズ

最近コードを送信した後、他の人の環境では Firephp に別の問題があることがわかりました。「ヘッダーはすでに送信されています...」というプロンプトは、Nginx バッファーが前回超過したときとは異なります。 Nginx のエラー ログを確認したところ、エラーは見つかりませんでした。一部の学生は、Apache でも同じ問題が発生していることに気づき、PHP の問題ではないかと疑っていました。でもApacheも使っているので問題ありません!エラープロンプトが表示されないページがあることを偶然発見しました。このページの出力コンテンツのサイズは約 1KB であることがわかりました。PHP の出力バッファーを超えると、自動的にバッファーデータが送信され、後続の Firephp が失敗するのではないかと思われます。 Http ヘッダーを通じてデバッグ情報を送信し、php スクリプトの実行を終了します。

テンプレートのレンダリング後に出力ステートメントをコメントアウトすると、エラーは表示されなくなります。PHP のバッファされた出力に問題があると判断されます。さまざまな環境で php.ini を比較すると、output_buffering の値が異なることがわかりました。私の値は On ですが、他のものはデフォルト値 4096 です。

PHP コード

 Output buffering is a mechanism for controlling how much output data  
 (excluding headers and cookies) PHP should keep internally before pushing that  
 data to the client. If your application's output exceeds this setting, PHP  
 will send that data in chunks of roughly the size you specify.  
 Turning on this setting and managing its maximum buffer size can yield some  
 interesting side-effects depending on your application and web server.  
 You may be able to send headers and cookies after you've already sent output  
 through print or echo. You also may see performance benefits if your server is  
 emitting less packets due to buffered output versus PHP streaming the output  
 as it gets it. On production servers, 4096 bytes is a good setting for performance  
 reasons.  
 Note: Output buffering can also be controlled via Output Buffering Control  
   functions.  
 Possible Values:  
   On = Enabled and buffer is unlimited. (Use with caution)  
   Off = Disabled  
   Integer = Enables the buffer and sets its maximum size in bytes.  
 Note: This directive is hardcoded to Off for the CLI SAPI  
 Default Value: Off  
  Development Value: 4096  
 Production Value: 4096  
http://php.net/output-buffering  
output_buffering = On

上記の説明によると、output_buffering が On または 4096 の場合、各リクエストで echo または print を使用すると、php は実際にはすぐに出力せず、到達したときに最初にバッファに保存します。一定のサイズ (4KB など) に達するか、スクリプトの実行が終了すると、バッファーの内容はブラウザーに出力され、クリアされます。

HTTP プロトコルがコンテンツを送信する場合、最初に応答ヘッダーが送信され、コンテンツの出力が開始されると、応答ヘッダーは変更できなくなります。 Output_buffering が On の場合、PHP はすべての出力をキャッシュし、コンテンツをブラウザに出力する前にリクエストが終了するのを待ちます。したがって、コンテンツがまだ残っていないため、Firephp が直前に Http 応答ヘッダーを変更しても問題はありません。この時点で出力; とき Output_buffering が 4096 (またはその他の固定値) の場合、PHP バッファーがいっぱいになるたびに、コンテンツが出力され、応答ヘッダーは出力できなくなります。ヘッダーを設定しようとすると、「ヘッダーはすでに送信されました…」というメッセージが表示されます。

Web サーバーのバッファ出力を制御すると、Facebook や Sina の Bigpipe などのユーザー エクスペリエンスが向上します。

今回は、ほとんどのページに大量のデバッグ情報が含まれているため、HTTP 応答ヘッダーが大きく (4KB よりもはるかに大きく、36KB に達するものもあります)、自動出力メカニズムがトリガーされることがわかりました。解決策: Output_buffering を On に変更し、コード内の ob_start() をより大きな値に変更します。


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