web-dev-qa-db-ja.com

PHPでエコーの前にXHRステータスを設定する必要があるのはなぜですか?

おそらく、この質問は Stack Overflow または別のサイトに属している可能性があります。その場合、私に教えてください。単に投票しないでください。喜んで移動させていただきます。

とにかく、私はサーバー管理の非常に基本的なことを学んでいるだけで、予想外のことが起こったときにラップトップで自分の小さなプライベートMySQLサーバーをいじっていました。 AJAX jQuery $。ajax() メソッドを使用してPHPページにリクエストを送信すると、私が関数を呼び出したにもかかわらず「200」の応答コード http_response_code(500); PHPコード。これがなぜであるのか理解できませんでした。 echoステートメントを使用してデータをJavaScriptページに返すことに気づき、http_response_code(500);関数をaboveall echoステートメントの場合、HTTP応答コードが正しく設定されます。

私はこれが正しい機能であることを理解していますが、なぜこれが事実であるのか疑問に思っていますか?エコー機能を使用する前にHTTP応答コードを設定する必要があるのはなぜですか?基になるプロトコルで何が起こっていますか?私の推測では、それはechoと関係があり、スクリプトが呼び出されたときにデータを返すように強制しますが、それではなぜ次のようなスクリプトを実行するのでしょうか。

echo "thing one";
echo "thing two";
http_response_code(500);
echo "thing three";

...まだ「3つ」をエコーし​​ますが、応答コードは変更しませんか?

それ自体に「問題」はありません。学ぶためにここにいます!ありがとう!

1
Guy

本文に何かを印刷する場合、ヘッダーはすでに送信されている必要があります。それはあなたが例えばecho()何か、または_<?php_の前にスペースがある場合でも。 Webサーバーは、ヘッダーを送信するまで何も出力できません。これはHTTP応答の形式であるため、すべての出力でヘッダーも送信されるためです。

あなたが使用しようとする場合 header() ヘッダーを送信すると、_Warning: Cannot modify header information - headers already sent by_を取得できます。

通常のHTMLタグ、ファイル内の空白行、またはPHPから実際の出力が送信される前に、header()を呼び出す必要があることに注意してください。 include、またはrequire、関数、または別のファイルアクセス関数を使用してコードを読み取り、header()の前に出力されるスペースまたは空の行があると、非常によくあるエラーですと呼ばれます。単一のPHP/HTMLファイルを使用する場合にも同じ問題が存在します。

http_response_code() はHTTPヘッダーを送信せず、後で送信されるヘッダーリストを準備するだけなので、このエラーはトリガーされません。 if条件で headers_sent() を使用すると、header()でこれらのエラーを防ぐことができますが、http_response_code()

2
Esa Jokinen