繁体   English   中英

从PHP API GET请求缓存Google日历事件

[英]Cache Google Calendar Events from PHP API GET Request

我正在使用google-api-php-client(API v3)在页面上显示来自我的Google日历的事件列表。 它正在工作,但是我想将结果缓存在本地磁盘上,因此不必每次页面加载时都进行API调用(日历变化不大)。 是否可以缓存结果?

有一个名为Google_FileCache.php的文件,其中有一个Google_FileCache()类,看起来它可以满足我的要求,但是我根本找不到任何文档,有人使用过吗?

到目前为止,这是我的代码:

require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_CalendarService.php';
session_start();
$CLIENT_ID = '{my client ID}';
$SERVICE_ACCOUNT_NAME = '{my service account name}';
$KEY_FILE = '{my p12 key file}';
$client = new Google_Client();
$client->setApplicationName("Public Calendar");
$client->setUseObjects(true);
if (isset($_SESSION['token'])) {
    $client->setAccessToken($_SESSION['token']);
}
$key = file_get_contents($KEY_FILE);
$client->setAssertionCredentials(new Google_AssertionCredentials(
    $SERVICE_ACCOUNT_NAME,
    array('https://www.googleapis.com/auth/calendar', "https://www.googleapis.com/auth/calendar.readonly"),
    $key)
);
$client->setClientId($CLIENT_ID);
$service = new Google_CalendarService($client);
if ($client->getAccessToken()) {
    $_SESSION['token'] = $client->getAccessToken();
}
$rightNow = date('c');
$params = array('singleEvents' => 'true', 'orderBy' => 'startTime', 'timeMin' => $rightNow);
$events = $service->events->listEvents('primary', $params);
foreach ($events->getItems() as $event) {
    echo '<p>'.$event->getSummary().'</p>';
}

Just和仅供参考,以供其他所有人了解如何执行此操作。 我想出了如何使用Google_FileCache类来缓存返回的GET请求。 下面是我的解决方案:

// Files to make API Call
require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_CalendarService.php';
// Files to cache the API Call
require_once 'google-api-php-client/src/cache/Google_Cache.php';
require_once 'google-api-php-client/src/cache/Google_FileCache.php';
// Google Developer info for gmail.com Service API account
$CLIENT_ID = '{My Client ID}';
$SERVICE_ACCOUNT_NAME = '{My Service Account Name}';
// Make sure you keep your key.p12 file in a secure location, and isn't readable by others.
$KEY_FILE = '{My .p12 Key File}';
$client = new Google_Client(); // Start API call
$client->setApplicationName("Public Calendar");
$client->setUseObjects(true); // Need this to return it as an object array
// Checking to see that we are authenticated (OAuth2) to make API to calendar
if (isset($_SESSION['token'])) {
 $client->setAccessToken($_SESSION['token']);
}
// Load the key in PKCS 12 format (you need to download this from the Google API Console when the service account was created.)
$key = file_get_contents($KEY_FILE);
$client->setAssertionCredentials(new Google_AssertionCredentials(
    $SERVICE_ACCOUNT_NAME,
    array('https://www.googleapis.com/auth/calendar', "https://www.googleapis.com/auth/calendar.readonly"),
    $key)
);
$client->setClientId($CLIENT_ID); // Set client ID for my API call
$service = new Google_CalendarService($client); // Start API call to Calendar
//Save authentication token in session
if ($client->getAccessToken()) {
  $_SESSION['token'] = $client->getAccessToken();
}
// Start Caching service
$cache = new Google_FileCache();
$cache_time = 43200; // 12 hours
// If cache is there & younger than 12 hours then load cached data
if($cache->get('events_cache', $cache_time)) {
    $events = $cache->get('events_cache');
    $file_status = "cached";
}
else {
    //If it is not then make Calendar API request to Google and get the results
    $rightNow = date('c');
    $params = array('singleEvents' => 'true', 'orderBy' => 'startTime', 'timeMin' => $rightNow, 'maxResults' => 5);
    $events = $service->events->listEvents('primary', $params);
    $cache->set('events_cache', $events); // Save results into cache
    $file_status = "live";
}
// Start collecting info to be returned
echo '<!-- '.$file_status.' -->'; // So I can tell if the results are cached or not
echo '<ul class="events">';
foreach ($events->getItems() as $event) {
    // Make link to event and list event name
    echo '<li><a href="'.$event->getHtmlLink().'">'.$event->getSummary().'</a></li>';
}
echo '</ul>';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM