もともとPHPのfile_get_contents関数を使ってAPIからデータを取得するプログラムを書いていたのだが、ある時から謎のエラーでデータを取得できなくなっていた。

そこで、file_get_contents関数での取得をやめて、以下のようにcurl関数を使って取得する方法に切り替えたのだが、こちらも同様にうまくいかなかった。

$url = 'https://example.com/api/';
$data = http_build_query(
  array(
    'key' => 'xxxx',
  )
);

$options = array(
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_TIMEOUT => 5,
);
$ch = curl_init($url.'?'.$data);
curl_setopt_array($ch, $options);
$json    = curl_exec($ch);
$info    = curl_getinfo($ch);
$errorNo = curl_errno($ch);
curl_close($ch);

$errorNoを確認すると60となっており、どうやらこれはSSL対応サイト(httpsのサイト)と通信しようとした時に、サーバー証明書の検証で問題が発生した際に返るエラー番号のようだ。

このエラーを回避するには、$optionsの設定に以下の1行を追加すれば良い。

$options = array(
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_TIMEOUT => 5,
  CURLOPT_SSL_VERIFYPEER => false, // この行を追加する
);

CURLOPT_SSL_VERIFYPEERにfalseを設定すると、サーバー証明書の検証をおこなわないようにできるので、エラーで困ったときはこの値をfalseにしておくと良い。