画像処理にPHPを使用する場合、 ImageCreateTrueColor関数を使用して、真の色の空白画像を作成することがよくあります。機能は、指定された幅と高さで真のカラー画像リソースを作成することです。これは、動的に生成される画像の関数によく見られます。一般的に、この関数自体は問題を引き起こしませんが、「すでに送信されたヘッダー」エラーに遭遇した場合、通常、HTTPヘッダー情報が事前に出力されるのは何らかの理由です。次に、このエラーの原因とそれを解決する方法を詳細に検討します。
コンテンツを出力する前にHTTPヘッダーを送信しようとすると、通常、「すでに送信された」エラーが発生します。 PHPは、コンテンツ(HTML、画像、ファイルなど)をブラウザに送信する前に、コンテンツタイプ、文字エンコード、キャッシュコントロールなどのHTTPヘッダー情報を送信する必要があります。スクリプトがコンテンツを出力する前にヘッダー情報を送信する順序を適切に制御しない場合、このエラーはトリガーされます。
ImageCreateTrueColorを使用して画像を生成する場合、通常、HTMLページの代わりに画像を出力することをブラウザに伝えることに、HTMLページを出力することをブラウザに伝えます。 ImageCreatetrueColorが呼び出される前にHTMLコンテンツまたはその他のテキスト情報が出力されると、「すでに送信されたヘッダー」エラーが発生します。
エラーの一般的な原因は次のとおりです。
スペースまたはニューライン:ファイルの上部または下部または下部のスペース、ラインブレーク、BOM(バイトオーダーマーク)などは、PHPの解析の前にいくつかの目に見えない文字をブラウザに送信します。
HTML出力:スクリプトにImageCreateTrueColorを呼び出す前にHTMLコンテンツを出力している場合、PHPはHTTPヘッダー情報を送信できなくなります。
デバッグ出力:開発プロセス中に、 ECHO 、 PRINT_R 、 VAR_DUMPなどのデバッグ関数を使用してデバッグ情報を出力すると、事前にコンテンツが送信され、エラーが発生します。
ImageCreateTrueColorは、MIMEタイプの画像を指定するために、Header()と組み合わせて使用する必要があります。たとえば、画像データを送信する前にこれがPNG画像であることをブラウザに伝える必要があります。
<span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: image/png'</span></span><span>);
</span></span>
ImageCreateTrueColorまたはImagePngを呼び出す前に出力(HTML、スペース、ニューラインなど)が送信された場合、PHPは再びこれらのヘッダーを送信できず、「ヘッダーが既に送信される」エラーが発生します。
この問題を解決するには、画像を出力する前にPHPスクリプトが何も送信しないことを確認する必要があります。一般的な解決策は次のとおりです。
PHPファイルの上部と下部にスペース、ラインブレーク、またはBOMがないことを確認してください。特に、PHPがタグ<?phpを起動するか、タグを終了した後、追加のスペースやニューラインがないことを確認してください。ファイルを開くとき、特にエディターを使用するときは、目に見えない文字を確認できます。
ImageCreateTrueColorとHeader()関数を呼び出す前に、ブラウザに出力されていることを確認してください。これらの機能の前に、 Echo 、 var_dump 、またはprint_rデバッグ出力を避けてください。デバッグ情報が出力する必要がある場合は、 OB_START()とOB_END_FLUSH()の間に配置して、出力を一時的にバッファーすることを検討してください。
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 出力バッファーをオンにします</span></span><span>
</span><span><span class="hljs-comment">// あなたのコード</span></span><span>
</span><span><span class="hljs-variable">$image</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatetruecolor</span></span><span>(</span><span><span class="hljs-number">200</span></span><span>, </span><span><span class="hljs-number">200</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: image/png'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">imagepng</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">ob_end_flush</span></span><span>(); </span><span><span class="hljs-comment">// 出力バッファーを終了します</span></span><span>
</span></span>
ImageCreateTrueColorを呼び出す前にファイルにある程度の出力を実行する必要がある場合は、出力バッファリングを使用できます。 ob_start()関数を使用すると、phpはすべて出力をキャッシュし、すぐにブラウザに送信されません。これは、画像が出力される前に、デバッグ情報またはその他のコンテンツを自由に出力できることを意味します。
<span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 出力バッファリングを開始します</span></span><span>
</span><span><span class="hljs-comment">// コード出力パーツ</span></span><span>
</span><span><span class="hljs-variable">$image</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatetruecolor</span></span><span>(</span><span><span class="hljs-number">300</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: image/png'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">imagepng</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>); </span><span><span class="hljs-comment">// 画像データを送信します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_end_clean</span></span><span>(); </span><span><span class="hljs-comment">// クリアしてバッファリングをオフにします</span></span><span>
</span></span>
PHP構成ファイルのoutput_bufferingオプションが、出力バッファーの動作に影響を与える場合があります。特に大きいまたは動的に生成された画像を処理する場合は、有効または適切に構成されていることを確認してください。
<span><span><span class="hljs-attr">output_buffering</span></span><span> = </span><span><span class="hljs-literal">On</span></span><span>
</span></span>
「すでに送信されたヘッダー」エラーに遭遇したとき、キーは、画像を送信する前にコードに出力があるかどうかを確認するか、ヘッダー情報を設定することです。この問題は、通常、不必要な空白文字を除外したり、デバッグ情報の出力を除外したり、出力バッファーを使用したりすることで解決されます。正しい方法は、不要な出力干渉なしに画像データを送信する前に、すべてのヘッダー情報が設定されることを確認することです。
この記事を通して、 ImageCreatetrueColorを使用するときに発生する可能性のある「すでに送信されたヘッダー」エラーを理解できることを願っています。