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

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

ただいまの
回答率

90.36%

  • PHP

    25497questions

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

「phpのif文」について、phpはどの順番で解釈し作業をしていくのか?

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 204

tajix_japan

score 78

下記の3ケ所の自社サーバーにcsvファイルを多数を保管しています。

http://100.example.com/aaa.csv
http://111.example.com/bbb.csv
http://122.example.com/bbb.csv

上記のファイルを、http://example.com/hyoji.php?csv=xxx  から読みに行き、表示させるphpを組んでいます。

3つのcsv保管サーバーにあるcsvファイルは無数にあり、100サーバーだけで保管できているもの、111サーバーだけで保管できているもの、122サーバーだけで保管できているもの、全てのサーバーに存在するもの(これが殆ど)が混ざっております。

やりたいこと
http://example.com/hyoji.php?csv=xxx  としたときに、該当のcsvファイルを探しだして表示するphpを組みました。
まずは、100のサーバーを探し、100のサーバーになかった場合、自動的に111のサーバーにあるかを探し、なかったら122のものをさらに探し表示ます。

それが下記のphpです。

<?php
$csv= htmlspecialchars($_GET['csv'], ENT_QUOTES, "UTF-8");

$path100 = 'http://100.example.com/<?php echo $csv ?>.csv';
$array100 = get_headers($path100);

$path111 = 'http://111.example.com/<?php echo $csv ?>.csv';
$array111 = get_headers($path111);

$path122 = 'http://122.example.com/<?php echo $csv ?>.csv';
$array122 = get_headers($path122);

$word100 = file_get_contents('http://100.example.com/csv_hyoji.php?csv=<?php echo $csv ?>');
$word111 = file_get_contents('http://111.example.com/csv_hyoji.php?csv=<?php echo $csv ?>');
$word122 = file_get_contents('http://122.example.com/csv_hyoji.php?csv=<?php echo $csv ?>');


// ファイルが存在するかチェックする
if ((strpos($array100[0],'OK')) 
{
print($word100);
} 
elseif ((strpos($array111[0],'OK'))
{
print($word111);
} 
elseif ((strpos($array122[0],'OK'))
{
print($word122);
} 
?>

懸念していること

上記のphpには、file_get_contentsが3つあります。
全てのcsvサーバーに該当のcsvファイルが存在した場合、通信量が3倍になることを懸念し、質問いたします。

phpの特性上、上から順番に読み込んでいくものなのか?

今回のphpでは

$word100 = file_get_contents('http://100.example.com/csv_hyoji.php?csv=<?php echo $csv ?>');
$word111 = file_get_contents('http://111.example.com/csv_hyoji.php?csv=<?php echo $csv ?>');
$word122 = file_get_contents('http://122.example.com/csv_hyoji.php?csv=<?php echo $csv ?>');


と事前に書いてあり、そのあとで下記のようなif文での表示をさせるようにしています。

if ((strpos($array100[0],'OK')) 
{
print($word100);
} 
elseif ((strpos($array111[0],'OK'))
{
print($word111);
} 
elseif ((strpos($array122[0],'OK'))
{
print($word122);
} 

【最初の質問】
(1)
上記の場合、「file_get_contents」が事前にある関係上、「if文」が来る前にあらかじめ「file_get_contents」を読み込んでしまってから(通信してしまってから)、if文を解釈して適切に表示するものなのか?
(2)
それとも、php上で、「file_get_contents」があったとしても、それをprintなりechoなりで表示の指示が出るまでは「file_get_contents」は行わず、printなりechoなりで表示の指示が出た後に「file_get_contents」を行い、通信を開始するものなのか

が最初の質問です。

よろしくお願いいたします。

【次の質問】
もし上記の(1)と(2)の選択の中では(2)が正解だった場合、次の質問として下記があります。

if文でcsvファイルの存在を確認して($arrayで200 OKが返ってくるかの確認)、OKが返ってきたらそのサーバーのcsvファイルを表示することになっています。
今回のif文では、最初のifで100のサーバーを探し、elseifで111のサーバーを探し、次のelseifで122のサーバーを探すことになります。
当方としては、「最初のifで100のサーバーを探した末csvファイルが見つかったら、次のelseif以降の111&122への通信はして欲しくありません。

質問です。

phpのif文は、

if ((strpos($array100[0],'OK')) 
{
print($word100);
} 
elseif ((strpos($array111[0],'OK'))
{
print($word111);
} 
elseif ((strpos($array122[0],'OK'))
{
print($word122);
} 


となっていた場合、最初にOKが出てきた時点で、次の作業に移らず(通信をせず)打ち切るということで問題ありませんでしょうか?

普通に考えると次の処理には移らず終了するものとは思いますが、
「実はPHPというものは、全てを読み取った後(上記では100、111、122のサーバーとの通信を全て終了した後)に、あらためてIF文を解釈してprintするものだ」ということがないかを確認する次第です。

よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

【最初の質問】
(1)
上記の場合、「file_get_contents」が事前にある関係上、「if文」が来る前にあらかじめ「file_get_contents」を読み込んでしまってから(通信してしまってから)、if文を解釈して適切に表示するものなのか?

YES

これは実際に検証してみればわかることなので、
検証方法を考えて検証してみる事を習慣づけると良いです。

今回の件だと、ブレークポイントを仕掛けられるデバッガを使うと簡単に確認できますし、
デバッガを使わなくても、ifの前でファイル内容が格納されている変数をvar_dump()すればifで評価される前に読み込みが終わっていることを確認できます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/30 08:07

    ありがとうございます。助かりました。このままでは無駄な通信が発生するため別の方法を考えます。
    また、ご指導ありがとうございました。今後のスキル向上に役立たせていただきます。
    深く感謝申し上げます。

    キャンセル

+2

通信の有無の話をするのであればPHPはサーバーサイドの言語なので、
phpを実行させた時点で通信はしています。
となると前提崩れるような気がしますが、いかがでしょうか。

あとは消費メモリの問題ですが、

$word100 = file_get_contents('http://100.example.com/csv_hyoji.php?csv=<?php echo $csv ?>');
$word111 = file_get_contents('http://111.example.com/csv_hyoji.php?csv=<?php echo $csv ?>');
$word122 = file_get_contents('http://122.example.com/csv_hyoji.php?csv=<?php echo $csv ?>');

(get_headers()もですが。)
file_get_contents()時点でファイルへのアクセスは発生しているので、
メモリは増え続けていると思います。
メモリ量を観測してください。

ちなみに例示のif文を分解するとこうですよね。

if (条件A) {

} elseif (条件B){

} elseif (条件C){

}

file_get_contents()時点でアクセスしたファイルの情報すべてを文字列取りこんでますから、
あとはその文字列と事前にget_headers()で取得した配列の処理になります。
上から順に1つずつ比較。条件が満たされたらif文は終了。
※elseなどでつながっていたら満たされるまで順に比較します


蛇足:
htmlspecialchars()はhtml出力時に使うものであってパラメータ取得の時に使うものではありません。
file_get_contents()のファイル取得先URLに利用していることからurlencode()の方が妥当。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/30 08:41

    tanatさん
    私も回答作ってる途中で、file_get_contents()のファイル取得先が別URLであることに気づいて
    若干方向転換しました。(で「アクセス」と表現しました)
    いずれにしても今回のやり方だとifでは対応できませんね。
    get_headers()の結果だけで判断する感じでしょう。

    キャンセル

  • 2019/03/30 09:07

    > mts10806さん

    補足ありがとうございます。理解しました。

    > get_headers()の結果だけで判断する感じでしょう。
    同意です。

    キャンセル

  • 2019/03/30 09:44

    tanat様、mts10806様
    ベストアンサー後もいろいろお気遣いくださり、本当にありがとうございました。深く御礼申し上げます。

    キャンセル

+2

回答ではないです
仕様の詳細が分かりませんが一般論として、都度存在確認を「ファイル全体を取る」という形で実施するのはムダです。

普通は以下を検討します。
・サーバ管理者に、ファイルの存在箇所一覧をもらう → DB に保存箇所を投入
・一定時間毎にファイルの存在確認を実施 → DB に保存箇所を投入
・都度「ファイルの存在確認」をする場合は、header のみで存在を確認する

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/30 09:54

    DBの活用のご指摘、ありがとうございます。
    DB活用についても検討してみます。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • PHP

    25497questions

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