ずっと稼働してたサーバーでいつからかfile_get_contents()でエラーが起きており自サーバー内のファイルを読みにいけなくなるという現象が起きていました。
出てたエラーは下記のようなものでした。
file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in
file_get_contents(): Failed to enable crypto
file_get_contents failed to open stream: operation failed
file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in
どうやらSSLの証明書がいけないらしい
と言ってもレンタルサーバーでSSLの証明書をこちらでどうこうという事が難しいので
PHP側でなんとかするしかないという結論に至りました。
今までのソースは
$data = file_get_contents ( $url );
こういう感じでデータを取得していた部分を少し書き換えます。
$cnt['ssl']['verify_peer'] = false;
$cnt['ssl']['verify_peer_name'] = false;
$data = file_get_contents ( $url , false , stream_context_create ( $ cnt ) );
と変更します。
verify_peer はSSL サーバー証明書の検証を要求するかどうかでデフォルトの値は true です。
verify_peer_nameはピア名の検証を要求するかどうかでデフォルトの値は true です。
この2つの部分を変更したものを第3引数に stream_context_create ()関数を使って渡してあげます。
これをしてあげたら無事にエラーを起こさずファイルの内容を取得できるようになりました。
ただ、PHPの公式のドキュメントに
「一般的にはおすすめできませんが、 コンテキストオプション verify_peer を false にしてリクエストでの
ピア証明書の検証を無効化することもできます。
また同じく、ピア名の検証も、コンテキストオプション verify_peer_name を false にすれば無効化できます。」
と記述があったので、これをする方は何か問題が起こっても自己責任でお願いします。
一番いいのはSSLの方をいじってエラーが出ない状態にするのが一番いいかと思うのですが、今回のは苦肉の策というか、とりあえず急ぎで file_get_contents() の関数が動く状態にしたい時に使う応急処置的なものになるかと思います。
以下のサイトにもっと細かい説明が出ているので理解を深めたい方は参考にしてみてください。