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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

3回答

1072閲覧

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

gitboku

総合スコア32

PHP

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

0グッド

2クリップ

投稿2017/12/25 15:43

編集2017/12/25 15:54

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

PHP

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

実際に送信されるデータの中身は一行下の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

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

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

bash

1curl -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のサイトではどうなるか確認してみます。

bash

1curl -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

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

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

投稿2017/12/25 17:49

Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問1

PHP

1header("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
参考になりそうかも

投稿2017/12/25 16:02

rururu3

総合スコア5545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

質問1について

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

PHP

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

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

質問2について

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

投稿2017/12/25 16:05

sakapun

総合スコア888

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問