WEB/システム/IT技術ブログ

file_get_contentsでhttpsから始まる情報を取得できない

PHPの関数「file_get_contents」でAPIを利用した情報を取得することがあります。
但し、対象が「https」で始まるurlの場合に、情報が取得できません。
何度もこの問題に直面し、その度に頭を悩ませてしまいます。記憶力が。。。
というわけで、ここでしっかりメモを残しておきます。

「file_get_contents」でhttpsから始まる情報にアクセスできない

例えばAPIなどを利用するにあたり、その情報にアクセスするために以下のようなソースを記述します。

if(($res = @file_get_contents($url)) === false){
	(略)
}

ここで、$urlの中身が「https」で始まるurlの場合に、情報の取得に失敗してエラーになってしまいます。

Notice (8): Undefined variable: http_response_header xxx, line 688]
Notice (8): Undefined offset: 2 [xxx, line 688]
Notice (8): Undefined offset: 1 [xxx, line 688]

このようなエラーです。「xxx」はファイルパスです。

「allow_url_fopen」を有効にする

この問題を解決する方法をwebで検索すると、以下の方法が多くヒットします。
「phpの設定でallow_url_fopenを有効にする」
具体的にはphp.iniをテキストエディタで開き、以下の部分を「On」にします。

allow_url_fopen = On

一般的にはこれで解決することが多いようですが、私の場合は別件です。
私のケースではxamppを利用しているのですが、そもそもxamppではデフォルトで「allow_url_fopen」の値は「On」なんですよね。

「openssl」を有効にする

私のケースでの正解はこれです。「openssl」を有効にします。
Opensslの詳細はこちらでは触れませんが、SSLを利用するためにPHPの設定でライブラリを読み込み、有効にします。
「php.ini」をテキストエディタで開き、「extension」を読み込んでいる個所の末尾にでもこの1行を追加します。もしくは、該当する行がコメントアウトされている場合はコメントアウトを解除して、有効にします。

extension=php_openssl.dll

そのあと、Apacheを再起動してアクセスしてみれば、エラーは発生しません。問題解決です。

毎度、このエラーに出くわしては、具体的なエラーログも見つけられずに、時間を費やしてしまいます。
まだまだ勉強不足だな。

B!

Comment

  • ヤマザキ より:

    XAMPPのSendmailでメールを送信する際に、以下のエラーが出て送信できません。
    ネットで調べても出てこないため、解決方法をご存知であればご教授ください。
    【エラー詳細】
    ファイル:xampp/sendmail/error.log
    内容:TLS 1.0 and 1.1 are not supported. Please upgrade/update your client to support TLS 1.2. Visit https://aka.ms/smtp_auth_tls. [TYAPR01CA0083.jpnprd01.prod.outlook.com]

  • yamashiro より:

    すみません。。本記事とは別件だと思いますが、私には分かりかねます。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Monthly Archives