googleカレンダーapiでタイムアウト

このQ&Aのポイント
  • googleカレンダーからデータ取得処理を1日平均して200回程度行っているのですが、今年の2月以降タイムアウトエラーが1日当たり1~3回程度発生する様になりました。
  • 再度取得処理を行えば問題無く取得出来る様です。特にgoogleカレンダー側で障害が発生しているとも思えないのですが、何が考えられますでしょうか。
  • プログラム側でタイムアウト時に数回のリトライ処理を実装する等の対策を行うくらいしか無いのでしょうか?
回答を見る
  • ベストアンサー

googleカレンダーapiでタイムアウト

2年程前からgoogleカレンダーと連携した社内アプリを作成して運用しています。 googleカレンダーからデータ取得処理を1日平均して200回程度行っているのですが今年の2月以降タイムアウトエラーが1日当たり1~3回程度発生する様になりました。 再度取得処理を行えば問題無く取得出来る様です。 特にgoogleカレンダー側で障害が発生しているとも思えないのですが、何が考えられますでしょうか プログラム側でタイムアウト時に数回のリトライ処理を実装する等の対策を行うくらいしか 無いのでしょうか? 以下環境です CentOS 7.4.1708 Apache 2.4.6 PHP 5.6.37 google-api-php-client-2.2.2 以下エラー発生時のログの一部となります。 [29-Feb-2020 15:18:39 Asia/Tokyo] 作成したPHPのID.PHP:Google_IO_Exception Object ( [retryMap:Google_IO_Exception:private] => Array ( [6] => -1 [7] => -1 [28] => -1 [35] => -1 [52] => -1 ) [message:protected] => Operation timed out after 100001 milliseconds with 0 out of -1 bytes received [string:Exception:private] => [code:protected] => 28 [file:protected] => /var/data/google-api-php-client/src/Google/IO/Curl.php [line:protected] => 126 [trace:Exception:private] => Array ( [0] => Array ( [file] => /var/data/google-api-php-client/src/Google/IO/Abstract.php [line] => 136 [function] => executeRequest [class] => Google_IO_Curl [type] => -> [args] => Array ( [0] => Google_Http_Request Object ( [batchHeaders:Google_Http_Request:private] => Array ( [Content-Type] => application/http [Content-Transfer-Encoding] => binary [MIME-Version] => 1.0 ) [queryParams:protected] => Array ( [maxResults] => 5000 [orderBy] => startTime [singleEvents] => true [timeMin] => 2020-02-22T00:00:00+09:00 [timeMax] => 2020-09-03T00:00:00+09:00 ) [requestMethod:protected] => GET [requestHeaders:protected] => Array

質問者が選んだベストアンサー

  • ベストアンサー
  • akira1720
  • ベストアンサー率80% (127/158)
回答No.1

はい、基本的に API へのリクエストを行うプログラムでは数回のリトライを行うように設計するのが普通です。ましてや外部の会社が無償で提供しているものは、一定の割合でフェイルするのが当然と考えましょう。Google Calendar API へのリトライであれば、最短で数秒の間隔をあけ、リトライの回数が増えるたびに指数関数的にリトライの間隔を広げていくようにしましょう。(サーバーやネットワークの負荷が高くてフェイルしているときにさらに負荷を上げてしまうのを防ぐため。)

kozax05
質問者

お礼

回答ありがとうございます。リトライ処理を実装し複数回応答が無い場合にエラーとする事にしました。又、エラー発生時に使用者へのメッセージをGoogle側の問題である事を表示して運用側(私)へクレームが来ないように修正しました(汗

関連するQ&A

  • Google Calendar API

    現在、初心者ですがwebプログラムの勉強中です。 Google Calendar APIをやろうと思っているのですが、 PHPのライブラリーをインストールして一緒にインストールしたsimple.phpを動かそうとすると失敗します。 simple.phpにClientId, ClientSecret, RedirectUri, DeveloperKeyを入力してindex.phpとして保存しています。 そこにアクセスするとアクセス認証画面になり、許可をするとredirectでそのindex.phpに帰ってくるようになっているのですが、帰ってきてから $calList = $cal->calendarList->listCalendarList(); の行で止まります。 アクセスを認証した状態でClientId, ClientSecret, RedirectUri, DeveloperKeyの行をコメントアウトしてブラウザをリロードするとうまくいきます。 全くもってよく分かりません。 何か心当たりのある方、よろしくお願いします。

  • google calendar apiで質問です!

    google calendar api とjavascriptを使ってGoogle Calendarに予定の書き込みを行いたいです! しかし、ログインの処理がうまくいっていないためうまく動作しません。 下記のプログラムでログインボタンを押すと、googleアカウントのページに飛び要求されたページは無効です。と表示されてしまいます。 ここのログイン処理がうまくいかないためCalendarへの書き込みが行えないのですが、どのようにしたらいいでしょうか? よろしくお願いします。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>calendar test</title> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript"> <!-- google.load("gdata","2"); google.setOnLoadCallback(getMyFeed); function getMyFeed(){ var service = null; var url = "http://www.google.com/calendar/feeds/calendar id/public/full"; service = new google.gdata.calendar.CalendarService ("calendar-sample"); query = new google.gdata.calendar.CalendarEventQuery(url); query.setOrderBy(google.gdata.calendar. CalendarEventQuery.ORDERBY_START_TIME); query.setSortOrder(google.gdata.calendar. CalendarEventQuery.SORTORDER_DESCENDING); query.setSingleEvents(true); query.setMaxResults(10); var start = new google.gdata.DateTime.fromIso8601 ("2013-01-01"); var end = new google.gdata.DateTime. fromIso8601("2013-12-31"); query.setMinimumStartTime(start); query.setMaximumStartTime(end); service.getEventsFeed(query, callback, handleError); } function callback(result) { var entries = result.feed.entry; var res = ""; for (var i = 0; i < entries.length; i++) { var entry = entries[i]; var title = entry.getTitle().getText(); var times = entry.getTimes(); res += (i + 1) + ": " + title + " (" + times[0].startTime + ")<br />"; } document.getElementById("view").innerHTML = res; } function handleError(error) { alert(error); } function Login(){ var scope = 'https://www.google.com/calendar/feeds/'; var token = google.accounts.user.login(scope); } function doAction(){ var service = null; var url = "http://www.google.com/calendar/feeds/calendar id/private/full"; service = new google.gdata.calendar.CalendarService ("calendar-sample"); var scope = "https://www.google.com/calendar/feeds/"; token = google.accounts.user.checkLogin(scope); if (token == ""){ alert("ログインしていません。"); return; } var t1 = document.getElementById("time1").value; var t2 = document.getElementById("time2").value; var title = document.getElementById("title").value; var start = new google.gdata.DateTime.fromIso8601(t1); var end = new google.gdata.DateTime.fromIso8601(t2); var entry = new google.gdata.calendar.CalendarEventEntry(); entry.setTitle(google.gdata.atom.Text.create(title)); var when = new google.gdata.When(); when.setStartTime(start); when.setEndTime(end); entry.addTime(when); var func = function(result) { alert("イベントを追加。"); getMyFeed(); } service.insertEntry(url,entry,func,handleError, google.gdata.calendar.CalendarEventEntry); } //--> </script> </head> <body> <h1>サンプル</h1> <img src="authentication.gif"> <input type="button" value="Login" onclick="Login();"> <hr> <input type="text" id="time1" value="2013-01-01"><br> <input type="text" id="time2" value="2013-01-01"><br> <input type="text" id="title"><br> <input type="button" value="add" onclick="doAction();"> <hr> <div id="view" style="color:#096;"></div> </body> </html>

  • グーグルカレンダーでカレンダーをWEBに表示した予約システム

    例えば英会話のホームページにGoogleカレンダーを使ってレッスンの予定を公開し、生徒さんがそのカレンダーを見てあいている時間に予約を入れると言うようなシステムを作ることはできるのでしょうか?(PHP+MySQLなど) その場合、生徒さんもGoogleアカウントが必要ですか?それとも学校だけアカウントがあれば大丈夫でしょうか? ただレッスンのスケジュールを表示するだけなら学校のアカウントだけで平気そうですが、生徒さんが自分の予定を入れる場合は生徒さんもアカウントが必要になるのでしょうか?それとも、カレンダーAPIを使ったプログラミングでうまくできますか? GoogleカレンダーとそのAPIを使ってレッスン予約システムが作れたらと思ったのですが、生徒さんもGoogleアカウントを持っている必要があるとなるとあまり現実的ではないと思って質問させていただきました。

    • 締切済み
    • PHP
  • Google chart API 、PHP、MySQLを使って

    Google chart API 、PHP、MySQLを使って折れ線グラフを作成したのですが良いサンプルが見つかりません。 PHPでMySQLから値を取得して、その値をGoogle chart APIによって折れ線グラフで表示したいのですが苦戦中です。 なにか良いサンプルがあったら教えていただけないでしょうか。 もしくは、どのようなコードを書けば良いか教えてください。 お願いします。

    • 締切済み
    • PHP
  • mixi graph apiのログイン状況の取得

    xamppの1.7.7(Apache 2.2.21/PHP 5.3.8)上でmixi graph apiのテストをしています。 使用言語はPHPです。 developerサイトのpeopleAPIに関するページは下記URLです。 http://developer.mixi.co.jp/connect/mixi_graph_api/mixi_io_spec_top/people-api/#toc-5 # アクセストークンを抽出 $my_array = json_decode($atdata,true); $at = $my_array["access_token"]; # ログイン状況の取得 $people_api_url = "http://api.mixi-platform.com/2/people/@me/@self?fields=lastLogin?oauth_token=".$at; $people = file_get_contents($people_api_url); echo '<br />'.$people; 上記のfile_get_contentsに対して、failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Requestが出てしまいます。 ちなみにscopeの指定は、 $url = $authorization_url."?client_id=".$consumer_key."&response_type=code&scope=r_profile_last_login&display=pc"; で行なっています。 scopeをr_profileにして、 $people_api_url = "http://api.mixi-platform.com/2/people/@me/@self?oauth_token=".$at; のように変えると、同じpeopleAPI内の友人一覧の取得に関しては取得できるため、scopeの指定が間違っているのだと思うのですが…… 何が間違っているのかわかりません。 PHP初心者でまだわからないことだらけですが、もし何か記述方法の間違い等少しでもわかる方がいれば教えて頂けると幸いです。

    • ベストアンサー
    • PHP
  • youtube API V3でのlist作成

    youtube API V3を使用して、指定したチャンネルの動画リストを作成したいのですが、うまくいきません。 以下のコードを作成したのですが、御指南いただけると幸いです。 よろしくお願いいたします。 <?php require_once 'google-api-php-client/src/Google_Client.php'; require_once 'google-api-php-client/src/contrib/Google_YouTubeService.php'; $DEVELOPER_KEY = 'デベロッパーキー'; $client = new Google_Client(); $client->setDeveloperKey($DEVELOPER_KEY); $youtube = new Google_YoutubeService($client); try { $searchResponse = $youtube->channels->listChannels('id', array( 'id' => 'ここにチャンネルID', 'maxResults' => $_GET['maxResults'], )); foreach ($searchResponse['items'] as $searchResult) { switch ($searchResult['id']['kind']) { case 'youtube#video': $videos .= sprintf(' <div class="slide"> <a><img src="%s"></a> <div class="meta-slider"> <div class="category"> <a href="http://www.youtube.com/watch?v=%s" target="_blank">%s</a> </div> <div class="media-video"></div> </div> </div> ', $searchResult['snippet']['thumbnails']['high']['url'], $searchResult['id']['videoId'], $searchResult['snippet']['title'], $searchResult['id']['videoId']); break; } } $htmlBody .= <<<END $videos END; } catch (Google_ServiceException $e) { $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>', htmlspecialchars($e->getMessage())); } catch (Google_Exception $e) { $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>', htmlspecialchars($e->getMessage())); } ?> <?php echo $htmlBody ?>

    • 締切済み
    • PHP
  • connect タイムアウトのデフォルト

     Perl を使って HTTP 経由で HTML ファイルを取得するロジックを組んでいます。  通常、コネクト時のタイムアウト処理にはシグナルを使用しますが、これだとルーチンの呼び出し元に戻れません。  タイムアウトしたら終了せずに次の処理へ進む、というロジックを組みたいのですが、シグナルを設定しなかった場合、処理はちゃんと戻ってくるでしょうか。  本当ならこのくらい自分で確認すりゃいいんですが、なんせ「戻ってこないホスト」に心当たりがないので確認できないのです(^_^;  もしくは、シグナルのコールバック関数から元のルーチンへ戻る方法でもいいのです。  何かご存知の方がいらっしゃいましたら、よろしくお願いします。

    • ベストアンサー
    • Perl
  • HTTP_Request2のタイムアウトの設定

    PEARのHTTP_Request2の設定項目に「connect_timeout」と「timeout」があるのですが、 この2つの違いを教えていただきたく質問致しました。 http://pear.php.net/manual/en/package.http.http-request2.config.php -connect_timeout Connection timeout in seconds. Exception will be thrown if connecting to remote host takes more than this number of seconds. -timeout Total number of seconds a request can take. Use 0 for no limit, should be greater than connect_timeout if set. Exception will be thrown if execution of HTTP_Request2::send() takes more than this number of seconds. 例えば次のようにした場合、何をするまでが10秒で、何をするまでが20秒なのでしょうか。 $request = new HTTP_Request2('http://www.goo.ne.jp/', HTTP_Request2::METHOD_GET, array('connect_timeout' => 10, 'timeout' => 20)); try { $res = $request->send(); } catche ... よろしくお願い致します。

    • 締切済み
    • PHP
  • PHP データ 送受信

    http://hogehoge.com/form.php http://hogehoge.com/send.php http://localhost.com/api.php http://hogehoge.com/send.phpにアクセスした際に http://hogehoge.com/form.phpで入力したデータを http://localhost.com/api.phpに飛ばす方法に困っています。 参考サイト http://blog.code4u.org/archives/407 send.php側 $url = 'http://localhost.com/api.php'; $params = array( 'name' => $name, 'email' => $email, 'address' => $address, 'tel' => $tel, ); $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, FALSE); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/x-www-form-urlencoded' ) ); $result = curl_exec($ch); curl_close($ch); と記述したのですが、 api.php でデータを受け取るコードがわからず困っています。 お分かりの方がいたらお願いします。

    • 締切済み
    • PHP
  • プロキシサーバ経由でTwitter APIを使用

    レンタルサーバーで、PHPを使用したTwitterの自作botを作成しています。 どんなことが出来るのか、というのを色々いじって遊んでいるのですが、 サーバーから直接Twitter APIを使用するときには正常に動いているのに 間にプロキシサーバーを噛ませると正常に動作しないことに気付きました。 ********* ▼プログラム(twitteroauth.php内のfunction http)▼   (前略) curl_setopt($ci, CURLOPT_URL, $url); curl_setopt($ci, CURLOPT_HTTPPROXYTUNNEL, true); curl_setopt($ci, CURLOPT_PROXY, 'http://xxx.xxx.xxx.xxx'); curl_setopt($ci, CURLOPT_PROXYPORT, '8080'); $response = curl_exec($ci); if ($response === false) { エラーログ出力(curl_error($ci)); }   (後略) ********* 上記のようなプログラムを追加して実行すると、 以下のようなエラーログが出力されました。 「Received HTTP code 0 from proxy after CONNECT」 ネットで調べて、SSLが関係しているのでは?というところまでは調べられたのですが、 解決方法が分からず困っております。 詳しい方、ご教授いただけないでしょうか。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP