【PHP】file_get_contents()で外部URLが開けないときの対処法。

file_get_contents()はとても便利な関数で、例えば

<?php
$url = 'https://www.google.co.jp' ;
$data = file_get_contents( $url ) ;
?>

と、これだけで外部URLのソースを取得できます。

しかし、サーバのPHP設定(php.ini)で、変数allow_url_fopenの値が0(Off)に設定されていると、上記のような方法で外部ファイルを取得することができなくなります。

PHP Warning:  file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in xxx.php
のような警告が出るときは、この設定が原因。

サーバのセキュリティ強化のためにこのような設定にしていることも多かろうと思われますが、どうしても外部ソースを取りたいならば…

(1) セキュリティを多少犠牲にして、php.iniを編集。allow_url_fopen の値を 1 (On)にする。

もしくは、

(2) file_get_contents以外の代替手段を利用する。

…という対処が考えられます。

PHPファイル内で ini_set() 関数を使って
ini_set( 'allow_url_fopen' , 1 );
としてやっても、たぶん php.ini の設定を上書きすることはできないと思います。

(2)の方法を取るならば、file_get_contents を cURLで置き換えるのがよかろう。

上記の例と同じ動作をさせるには、最低限…

<?php
$url = 'https://www.google.co.jp' ;
$curl_p = curl_init();
curl_setopt( $curl_p , CURLOPT_URL , $url );
curl_setopt( $curl_p, CURLOPT_RETURNTRANSFER, true); // 注1

$data = curl_exec( $curl_p );

curl_close( $curl_p );
?>

…という感じにすれば、変数 $data に $url の内容が格納できます。

注1) このオプション設定(CURLOPT_RETURNTRANSFERをtrueに)を行わないと、取得した内容が標準出力されてしまいます。

curl関数のオプションについては、PHPの公式マニュアル:PHP: curl_setopt - Manualを参照してみてください。

カテゴリ: