PHPでfile_get_contentsを使っていた時に陥るエラー。
ローカルではバッチリ動作していたのに、レンタルサーバにアップロードしたら動かなくなってしまうという……。
これが起きるのも、実際の画面で確認したいと言われてBasic認証をかけてテストサイトを構築した際。
file_get_contentsで取得して出力するはずのコンテンツが表示されないのです。
このエラーは何度か体験しているものの、都度忘れてしまってエラー内容から確認してしまったり。
さてさて、今回は備忘録という意味合いも含めて、file_get_contentsでのエラー確認方法と、Basic認証をかけた環境下でfile_get_contentsを動作させる方法について綴ります。
file_get_contentsに問題?まずはallow_url_fopenがOnか確認
さて、前述の通り、ローカル環境ではfile_get_contentsが無事に動いていたとしても、レンタルサーバ等のサーバにあげた段階で問題が起きることの多いfile_get_contents。
ということで、まずはエラーの原因を探っていきます。
まずは鉄板のphpinfo()。
サーバ側の設定で、allow_url_fopenがOffになっているとfile_get_contentsは使えません。
上の画像は僕が使っているXserverでの内容です。問題なさそうですね。
動作する環境ならfile_get_contentsのエラー内容の確認
file_get_contentsが使える環境であることがわかったら、次はfile_get_contentsでどんなエラーが起きているか確認します。
$domain = empty($_SERVER["HTTPS"]) ? "http://" : "https://"; $domain .= $_SERVER["HTTP_HOST"]; $url = $domain . '/foo/bar.php'; $data = http_build_query($_POST, "", "&"); $options = array('http' => array( 'method' => 'POST', 'content' => $data, 'header' => 'Content-Type: application/x-www-form-urlencoded', )); $options = stream_context_create($options); $contents = file_get_contents($url, false, $options); echo $contents; exit();
こちらが今回書いていたコードです。
このfile_get_contentsのコードのすぐ下で、$http_response_headerをプリントすることでエラー内容がわかります。
$contents = file_get_contents($url, false, $options); print_r($http_response_header);
具体的にはこのような記述になります。
この時点でブラウザで確認すると下記のように出力されます。
file_get_contentsが動かないという場合には、この出力を見れば大体分かるはずです。
上の出力は「401 Authorization Required」ということで、Basic認証が問題となっていそうなのが一目瞭然ですね。
いつもこの段階で、ああそうだったぁ〜と気付くわけです。反省。
ベーシック認証環境下でfile_get_contentsを使う
このままだとfile_get_contentsが動かないことでコンテンツが出力されないままとなってしまい困ってしまいます。
ということで、ベーシック認証下でもfile_get_contentsが動くようにしていきますよ。
$domain = empty($_SERVER["HTTPS"]) ? "http://" : "https://"; $domain .= $_SERVER["HTTP_HOST"]; $url = $domain . '/foo/bar.php'; $data = http_build_query($_POST, "", "&"); $header = array( 'Content-Type: application/x-www-form-urlencoded', 'Authorization: Basic '.base64_encode('id:password') ); $options = array('http' => array( 'method' => 'POST', 'content' => $data, 'header' => implode("\r\n", $header ), )); $options = stream_context_create($options); $contents = file_get_contents($url, false, $options); echo $contents; exit();
追加したのは、9行目。
file_get_contentsがhttp接続するときに、headerの値に認証情報を含める形にします。
これで$http_response_headerを改めて確認してみると、「200 OK」となっているはずです。
たったこれだけのことなのですが、いつも忘れてしまうんですよね……。
まとめ
ということで、今回はfile_get_contentsでのエラー確認方法と、Basic認証をかけた環境下でfile_get_contentsを動作させる方法について綴りました。
毎度調べるところからやっていると時間の無駄ですからね……。と言いながら毎度ハマるんですがw
コメント