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()は動作せず、エラーが発生します。

Warning: file_get_contents(): http:// wrapper is disabled in the server configuration by allow_url_fopen=0

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

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

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

file_get_contents()をcURLで書き換える

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

$url = "http://sample.com";
$json = file_get_contents($url, true);
$result = json_decode($json, true);

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

$url = "http://sample.com";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
$json = curl_exec($ch);
curl_close($ch);

$result = json_decode($json, true);

大方、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を使っておいたほうが安心かもですね。

コメントを残す

*