質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.26%

  • PHP

    15693questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPのheaderメソッドの使い方について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 85

gitboku

score 11

質問内容

以下のPHPコードについて質問が二つあります。

header("Content-Type: application/json");
echo $json;


質問1
このコードがjsonデータを送信しているのはわかるのですが、どのjsonデータを送信しているのかがわかりません。
headerメソッドは送信するべきjsonデータをどこからどのように見つけているのでしょうか?

質問2
上記のコードは、とあるWindowsアプリから送られてきたリクエストに対するレスポンスとして書かれていた、サーバサイドのものです。
当然このコードのレスポンスが返る先はそのWindowsアプリであることはわかります。
しかし、headerメソッドはどのようにしてWindowsアプリのURLを見つけているのでしょうか?
どこかで設定しているのでしょうか?

追記

少し調べなおしたところ、headerメソッドはデータを送信するのではなくHTTPヘッダを送信するメソッドであることがわかりました。
実際に送信されるデータの中身は一行下のecho $json;の部分だということがわかりましたが、ここで新しい疑問が出てきました。
echoとは「1 つ以上の文字列を出力する」という言語構造のはずですが、なぜこれがレスポンスを返したことになるのでしょうか?

自分はPHPを本格的に勉強し始めてから1年も経っていない初心者であり、認識の前提を間違えている可能性が否定できません。
もしそのような間違いを見つけましたら是非ご指摘ください。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

質問1

header("Content-Type: application/json");


はjson形式でデータを返すっていう宣言をしてるだけですので、これだけではデータは何も返してません。
この処理の後に何らかのデータを出力してるはずです

質問2

(Windowsアプリがきっとクライアント側と想定して)
クライアントがサーバーに接続してサーバーがPHPプログラム呼び出して、その接続を利用して何らかのデータを返してる感じです。基本的にWebブラウザで特定のURLを叩いた際に特定のサーバーが応答するのと同じ感じです。
PHPなので大体はクライアントとの接続はApacheというHTTPサーバーが受け持ち、HTTPサーバーがPHPを呼び出して結果をクライアントに返す感じですね

クライアント---HTTPリクエスト--->Apache----プログラムを呼び出し--->PHP
クライアント<---HTTPレスポンス---Apache<----結果受取---PHP
こんな感じ

いい感じのサイトがなかったのですが
http://www.actlink.co.jp/text/php/01/01.html
参考になりそうかも

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

実際に送信されるデータの中身は一行下のecho $json;の部分だということがわかりましたが、ここで新しい疑問が出てきました。
echoとは「1 つ以上の文字列を出力する」という言語構造のはずですが、なぜこれがレスポンスを返したことになるのでしょうか?

オンライン通信で、PHPを使用する場合基本的にはアスキー文字列での通信となります。必ず、クライアントからのリクエストとレスポンスが対になります。このリクエストとレスポンスが対になる通信方式は、TCPのHTTPプロトコルで定義されています。
http://viral-community.com/other-it/http-1873/
http://www.atmarkit.co.jp/ait/articles/1703/29/news045.html

 HTTP通信順序

  1. クライアントがリクエストをWebサーバーに送信(URLなど)
  2. サーバーにリクエストが届く
  3. サーバーはリクエストヘッダを解析して、指定のPHPやHTMLファイルをロード
  4. サーバーはレスポンスヘッダと、指定ファイルのアスキー文字列をコンテントボディーに繋げて返信
  5. クライアントはサーバーからレスポンスヘッダコンテントボディーを受け取る

サーバー間の通信には必ず、リクエストヘッダ、レスポンスヘッダというものが存在し、Content-Type: application/jsonというのは、サーバーやクライアントにJSONとして認識してネ、というものです。

echo JSON文字列;は、レスポンスとしてコンテントボディーに出力するもので、HTMLタグの出力と同じ動作をします。
なぜWebサーバーのコンテントボディーに入るのかは、PHPはWebアプリ用の言語なので、HTMLなどをPHPで出力することがメインだからです。

 コマンドライン

一方、コマンドラインでechoすると、ターミナルに直接表示されるわけですが、これはWeb用のPHP(libphp5.soやphp-cgi)と、コマンドライン用のPHP(php-cli)が別れているためです。

 レスポンスヘッダ

コンテントボディーが存在しない場合について考えてみます。下記のようなPHPファイルを作成してWebサーバーのドキュメントルートに置きます。

<?php
header('Content-Type: application/json');
?>

下記のコマンドでレスポンスヘッダを確認できます。ブラウザでアクセスすれば、開発者ツール(F12)でも確認ができます。

curl -I http://ドメイン/PHPファイル.php

レスポンスヘッダは下記のようになります。Content-Length: 0でボディーが何もないと表示されました。また、コンテントタイプは指定通りapplication/jsonとなっています。

HTTP/1.1 200 OK
Date: Sun, 24 Dec 2017 17:56:46 GMT
Server: Apache
Content-Length: 0
Connection: close
Content-Type: application/json

それでは、Googleのサイトではどうなるか確認してみます。

curl -LI "https://www.google.com"

上記のレスポンスヘッダは下記になります。https://www.google.co.jpにリダイレクトして、コンテンツはtext/html; charset=Shift_JISなので、HTMLだと言っています。その他にもCookieやらいろいろあります。

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: https://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=sCpBWuDrGbSL8QfF4JuICg
Content-Length: 272
Date: Mon, 25 Dec 2017 16:43:28 GMT
Alt-Svc: hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"

HTTP/1.1 200 OK
Date: Mon, 25 Dec 2017 16:43:28 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=Shift_JIS
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2017-12-25-16; expires=Wed, 24-Jan-2018 16:43:28 GMT; path=/; domain=.google.co.jp
Set-Cookie: NID=120=m6RnwiiVHa1XQRloByrLs4hTGMBM-T1hGhc534mlVVIWHl8v_Dv5Ab_6qTSxIfzihycwVPVJLahTIwPIUJlST3vLcyMm52tsuOLvCiFZMASMnIAPPOK7sO09wEYkzTCI; expires=Tue, 26-Jun-2018 16:43:28 GMT; path=/; domain=.google.co.jp; HttpOnly
Alt-Svc: hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding

新し言語をさわるときは、なぜそうなの?と突き詰めていくのも大事ですが、時には特に理由もないこともあります。 英語などの外国語を勉強する時に、文法についてなぜそのようなルールなのか? と考えないのと一緒です。 考え出すとラテン語など別の言語を勉強しだすことになり、本来の目的から逸脱してしまいます。

まずは、使い方をそういうものだと覚えて、そのうち慣れたら詳細を補充していけば良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

 質問1について

おそらく、なにも送信していない。が答えになる気がします。
ここでのheader関数はあくまで「JSON送るから受け取ったらちゃんとJSONとして解析してな!」と案内を飛ばすことが目的なのです。
本来ちゃんとデータを返す場合は

header("Content-Type: application/json");
echo '{"name" : "hogehoge"}';


などとすることでしょう。
しかし、この例のとおりであれば、echoやprintがないのでなにもデータを送っていません

 質問2について

HTTPとしてサーバにリクエストが来た場合には、そのリクエストがどこから飛んできたIPアドレスなのかサーバがわかっています。
そこに向けてデータを返すだけです。
アプリはリクエストを送るときに、「私は今受信を待っています」となっています。
そのため、そのパソコンにさえデータが届けば、待っているアプリに自動的に到着するのです。
したがってアプリのURLは特に通信の要素として必要ありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.26%

関連した質問

同じタグがついた質問を見る

  • PHP

    15693questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。