下記の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
1<?php 2$csv= htmlspecialchars($_GET['csv'], ENT_QUOTES, "UTF-8"); 3 4$path100 = 'http://100.example.com/<?php echo $csv ?>.csv'; 5$array100 = get_headers($path100); 6 7$path111 = 'http://111.example.com/<?php echo $csv ?>.csv'; 8$array111 = get_headers($path111); 9 10$path122 = 'http://122.example.com/<?php echo $csv ?>.csv'; 11$array122 = get_headers($path122); 12 13$word100 = file_get_contents('http://100.example.com/csv_hyoji.php?csv=<?php echo $csv ?>'); 14$word111 = file_get_contents('http://111.example.com/csv_hyoji.php?csv=<?php echo $csv ?>'); 15$word122 = file_get_contents('http://122.example.com/csv_hyoji.php?csv=<?php echo $csv ?>'); 16 17 18// ファイルが存在するかチェックする 19if ((strpos($array100[0],'OK')) 20{ 21print($word100); 22} 23elseif ((strpos($array111[0],'OK')) 24{ 25print($word111); 26} 27elseif ((strpos($array122[0],'OK')) 28{ 29print($word122); 30} 31?> 32 33
懸念していること
上記の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するものだ」ということがないかを確認する次第です。
よろしくお願いいたします。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/30 00:54