file_get_contentsが動かない?cURLを使いallow_url_fopenがOffのサーバに対応

file_get_contentsが動かない?cURLを使いallow_url_fopenがOffのサーバに対応

ファイル内容を読み込む関数「file_get_contents()」。
PHPからAPIなどの外部ファイルの内容を取得するにも使える関数ですが、サーバの設定によっては使えないという状況が起こりうる場合があります。

file_get_contents()が動作するには、サーバ側の設定のallow_url_fopenがOnになっている必要があります。
ところが、一部のサーバではallow_url_fopenがOffになっていたりします。

allow_url_fopenはphp.iniなどから設定変更できるものですが、そういったサーバではその設定変更すらも許されないことがほとんど。
そのような場合はallow_url_fopenがOffのサーバでも動作する「cURL」を利用します。

file_get_contents()が動かなかった場合の2つの対処法

前述の通り、allow_url_fopenがOffになっているサーバ環境ではfile_get_contents()は動作せず、エラーが発生します。

この場合の対処法は2つ。

一つ目はサーバ側の設定でallow_url_fopenをOnにすること。
これはphp.iniが編集可能な環境であれば設定を変更することができるのですが、allow_url_fopenがOffになっていることの多いサーバ、特に無料・格安系サーバに多い印象ですが、そういったサーバではphp.ini等の編集もできないことが多いんですよね。

ということで二つ目の対処法として、file_get_contents()ではなくcURLを利用する形となります。

file_get_contents()をcURLで書き換える

file_get_contents()で記述する場合は下記のようになるかと思います。

それをcURLで書き換えると下記のような形になります。

大方、file_get_contents()で求めていた結果と同様のものが取得できることを確認できるかと思います。

file_get_contents()よりも書くことは増えてしまいますが、cURLであれば細かい設定が可能となります。
各設定の内容は下記のようになります。

  • CURLOPT_URL … アクセスするurl
  • CURLOPT_HEADER … ヘッダ文字列の出力(Boolean)
  • CURLOPT_RETURNTRANSFER … curl_execの返り値を文字列にする(Boolean)
  • CURLOPT_TIMEOUT … cURL 関数の実行にかけられる時間の最大値

※参照:http://php.net/manual/ja/function.curl-setopt.php

まとめ

無料・格安系サーバに多いallow_url_fopenがOffの設定。

file_get_contentsを使ってプログラムを書いてローカルで動作確認、問題ないからいざサーバにアップロード!あれ、動かない……なんてことにならないように、最初からcURLを使っておいたほうが安心かもですね。

筆者について

筆者について


1982年、東京下町生まれ。
高校卒業後、アメリカへ留学。その後、「アートが根付いた国では絵だけで食えるのか」を確認するため、ドイツベルリンにてアート活動をおこなう。

日本に戻ってからは、コーディング・オーサリング・プログラミングなんかを経て、ウェブディレクターを肩書きにしておりました。現在は独立し、ブログやサイトの運用を軸に、ウェブサイトの企画提案からデザイン・構築まで手広く活動しております。何でも屋です。
制作のご依頼はお問い合わせフォームよりお願いします。

isLog〜イズログ〜では『日々生きること自体が旅』をモットーに、日々の旅を中心に綴っています。

詳しいプロフィールはこちら


feedly

コメントを残す

*