file_get_contentsがNULLを返すようになった原因の調査
2018年09月08日
PHPで、あるプログラムを作成していて、file_get_contents関数で特定のURLからJSONファイルを取得するという処理を行っていたのですが、以前は動作していたプログラムが、サーバ移行後に file_get_contents関数で取得できなくなってしまった現象に遭遇してしまったので調査と対応について記しておきます。
状況
・ 特定のURLから file_get_contents関数でJSONファイルを取得し、後に処理
・ 以前は動作していたが、サーバ移転後に動作しなくなった
・ レスポンスヘッダもNULLを返すようになっていて、原因が不明
調査
まず、エラーログを見て file_get_contents 関数がエラーになっていないかどうかを調べてみたのですが、エラーにはなっていませんでした。
結果からいうと、エラーになっていたわけではなく、取得がNULLになっているという謎の結果。
解決
ファイルを取得するのに、file_get_contents関数ではなく、cURL関数を使うことで解決できました。
以下の記事が参考になりました。
file_get_contents関数が動かなかった場合の方法 | Tips Note by TAM
cURL関数を使うことで、file_get_contentsとほぼ同じ動作をする関数を定義して、使用しました。
$result = curl_get_contents( $url, 120 ); //file_get_contentsの代用関数。120はタイムアウト(秒) function curl_get_contents( $url, $timeout ){ $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, $timeout ); $result = curl_exec( $ch ); curl_close( $ch ); return $result; }
何故 file_get_contents 関数が新しいサーバで動作しなかったのかについては不明ですが、代用の関数でなんとかなりました。