質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.65%

Google CalenderのAPIを使おうとすると SSL: fatal protocol error が出てしまう。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,346
退会済みユーザー

退会済みユーザー

はじめて質問させていただきます。
柳沼と申します。

PHPを触り始めて2年程度の初心者です。
わからないことばかりではありますが、お助け下さい。

Google Calender API を利用して祝日・振替休日の表示が可能なカレンダーを表示させようとしたところ、

file_get_contents() [function.file-get-contents]: SSL: fatal protocol error
のようなエラーが表示されてしまいました。

xamppを使ったローカル環境上では普通に表示できております。
allow_url_fopen は On になっておりました。

ローカルはPHP Version 5.5.11
サーバーはPHP Version 5.1.6
です。

また、ネット上で「OpenSSLの設定が・・・」のようなものもあったのでphpinfoでみたところ
【curl】
CURL support    enabled
CURL Information    libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5

【openssl】
OpenSSL support    enabled
OpenSSL Version    OpenSSL 0.9.8b 04 May 2006

というのがあるだけでした。

制限の厳しいレンタルサーバーのため、php.iniの設定などは行うことができません。

何卒宜しくお願い致します。
<?php

print_r(get_holidays_this_month(2014,11));


function get_holidays_this_month($year, $month){
  // 月初日
  $first_day = mktime(0, 0, 0, intval($month), 1, intval($year));
  // 月末日
  $last_day = strtotime('-1 day', mktime(0, 0, 0, intval($month) + 1, 1, intval($year)));
  $api_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'; //←api_keyは取得、ローカルでの動作は確認できてます。
  $holidays_id = 'outid3el0qkcrsuf89fltf7a4qbacgt9@import.calendar.google.com';  // mozilla.org版
  //$holidays_id = 'japanese__ja@holiday.calendar.google.com';  // Google 公式版日本語
  //$holidays_id = 'japanese@holiday.calendar.google.com';  // Google 公式版英語
  $holidays_url = sprintf(
    'https://www.googleapis.com/calendar/v3/calendars/%s/events?'.
    'key=%s&timeMin=%s&timeMax=%s&maxResults=%d&orderBy=startTime&singleEvents=true',
    $holidays_id,
    $api_key,
    date('Y-m-d', $first_day).'T00:00:00Z' ,  // 取得開始日
    date('Y-m-d', $last_day).'T00:00:00Z' ,   // 取得終了日
    31            // 最大取得数
    );
  if ( $results = file_get_contents($holidays_url) ) {
    $results = json_decode($results);
    $holidays = array();
    foreach ($results->items as $item ) {
      $date  = strtotime((string) $item->start->date);
      $title = (string) $item->summary;
      $holidays[date('Y-m-d', $date)] = $title;
    }
    ksort($holidays);
  }
  return $holidays;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

どうもそのエラーはサーバ(Google Calendar API?)側が通信を正しく終了して来ないときに出ることがあるようですね。
http://php.net/manual/ja/function.file-get-contents.php#refsect1-function.file-get-contents-notes
ここの警告の部分のようです。
この警告が出ても、実際には処理自体は正しくできていたりしないでしょうか?
できていないようであれば、警告表示を抑制する手順が必要になるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/11/21 09:21

    ご回答ありがとうございます。

    error_reporting(E_ALL ^ E_WARNING);

    を使用して表示の抑制も試してみたところ、データを取得できていないらしく真っ白画面になってしまいました。

    別サーバーに同じソースでアップしたところきちんと表示されました。
    PHP Version 5.3.3
    【curl】【openssl】【Phar】
    にOpenSSLについての記述があり、
    【curl】の項目がだいぶ多くあり
    【openssl】には
    OpenSSL Versionの代わりに
    ・OpenSSL Header Version
    ・OpenSSL Library Version
    の項目になっていました。

    キャンセル

  • 2014/11/21 09:30

    OpenSSLについては、OpenSSL support: enabledが出ていれば問題ないとは思いますが…
    ちなみに何度やっても同じエラーが出るのでしょうか?

    キャンセル

  • 2014/11/21 09:34

    http://blog.goo.ne.jp/_memento/e/dd91a6f23c7e1ec6f972a4a4fe6d8d2f
    こんな記事を見かけました。古いPHPだとOpenSSL関連で正しく動かない部分があるのかもしれません。

    キャンセル

  • 2014/11/21 11:08

    なるほど……実際に動かしたいサーバー(php5.16のもの)ですと、何度やっても同じエラーがでますね。

    記事リンクありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる