Google Calendar local cache voor sneller laden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • PerfectLight
  • Registratie: December 2009
  • Laatst online: 14-02 10:09
Dit is de eerste keer dat ik een website aan het bouwen ben (ja, daar is het al :P). De website is opzich redelijk draaiend mbv wordpress. Alles werkt prima, op 1 ding na, elke pageload moet de website een javascript uitvoeren om de kalenderevents van Google Calendar in te laden.

Ik wil dit op een of andere manier cachen naar de server oid zodat het opvragen van die kalender niet steeds 1 tot 2 seconden in beslag neemt, want het is gewoon erg lelijk.

Hoe de kalender werkt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
the_widget("WP_Widget_KO_Calendar",
        array(
            'title' => '',
            'url' => 'https://www.google.com/calendar/feeds/[KALENDER]',
            'url2' => 'https://www.google.com/calendar/feeds/[KALENDER]',   
        ),
        array('before_widget' => '<div class="calendarwidget">',
            'after_widget' => '</div>',
            'before_title' => '<div class="calendartitle">',
            'after_title' => '</div>'
        ));

Deze geeft een output vanuit javascript. Welke in de browser zo wordt weergegeven:
HTML:
1
2
3
4
5
6
7
8
9
10
11
<div class="calendarwidget">
<div class="calendartitle">
<div id="widget-ko_calendar--1-widget_title" class="ko-calendar-widget-title"></div>
</div>
<div id="widget-ko_calendar--1-widget_events" class="ko-calendar-widget-events">
<div class="ko-calendar-widget-loading">
</div>
</div>
<script defer="defer" type="text/javascript">
ko_calendar.loadCalendarDefered('widget-ko_calendar--1-widget_title', 'widget-ko_calendar--1-widget_events', 5, false, 'https://www.google.com/calendar/feeds/[KALENDER]', 'https://www.google.com/calendar/feeds/[KALENDER]', '', '[STARTTIME - ][TITLE]');
</script>


En na enkele seconden komt er ter vervanging van <div class="ko-calendar-widget-loading"> dit te staan, de lijst met afspraken.

code:
1
2
3
4
5
6
7
8
9
10
<div class="ko-calendar-date" classname="ko-calendar-date">08 jul</div>
<div class="ko-calendar-event-list" classname="ko-calendar-event-list">
<div class="ko-calendar-date" classname="ko-calendar-date">19 jul</div>
<div class="ko-calendar-event-list" classname="ko-calendar-event-list">
<div class="ko-calendar-date" classname="ko-calendar-date">29 jul</div>
<div class="ko-calendar-event-list" classname="ko-calendar-event-list">
<div class="ko-calendar-date" classname="ko-calendar-date">07 aug</div>
<div class="ko-calendar-event-list" classname="ko-calendar-event-list">
<div class="ko-calendar-date" classname="ko-calendar-date">10 aug</div>
<div class="ko-calendar-event-list" classname="ko-calendar-event-list">


Wat ik nu wil is deze lijst (inclusief een deel van de bovenstaande code) cachen. Maar ik krijg dit maar niet voor elkaar.

Wat ik al geprobeerd heb:
  • De Google Calendar zelf lokaal op te slaan, en deze eens in de zoveel tijd te laten update. Dit werkt niet omdat de javascript hem dan niet meer uit kan lezen oid.
  • Dit:
    PHP:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    <?php
    if ( is_user_logged_in() ) {
    
    $cache_file = $_SERVER['DOCUMENT_ROOT'].'/[---knip---].xml';
    
    if (file_exists($cache_file)) {
        $cache_time = 3600*24;
        $timedif = @(time() - filemtime($cache_file));
        if($timedif > $cache_time) {
    
            ob_start();
            the_widget("WP_Widget_KO_Calendar",
            array(
                'title' => '',
                'url' => 'https://www.google.com/calendar/feeds/[KALENDER]',
                'url2' => 'https://www.google.com/calendar/feeds/[KALENDER]',   
            ),
            array('before_widget' => '<div class="calendarwidget">',
                'after_widget' => '</div>',
                'before_title' => '<div class="calendartitle">',
                'after_title' => '</div>'
            ));
            $str = ob_get_contents();
            ob_end_clean();
    
            $file = fopen($cache_file, 'w');
            fwrite ($file, $str, strlen($str));
            fclose($file);
        }
    }
    }
    ?>

    Maar dan krijg ik alleen de oproep van het script te zien in de xml, en niet wat hij na die paar seconden pas laadt.
  • De widget caching plugin voor Wordpress. Maar die haalt ook niet zoveel uit.
Andere optie:
Ligt dit misschien aan de mogelijkheid dat er eerst nog wat gereken op de computer zelf plaats moet vinden? (Of ligt het echt aan de traagheid van het inladen van de bestanden vanaf Google?)

Een alternatief mbv een ics bestand is ook prima, zolang dat irritante laaddingetje maar verdwijnt.

[ Voor 0% gewijzigd door RobIII op 29-06-2011 02:55 . Reden: Code tag gefixed ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
[quote]PerfectLight schreef op woensdag 29 juni 2011 @ 02:39:
Wat ik al geprobeerd heb:
  • De Google Calendar zelf lokaal op te slaan, en deze eens in de zoveel tijd te laten update. Dit werkt niet omdat de javascript hem dan niet meer uit kan lezen oid.
Define lokaal? Op je server? Of op de client? En "omdat de javascript hem dan niet meer uit kan lezen oid" is natuurlijk geen accurate omschrijving van iets dat mis gaat. Krijg je foutmeldingen? Kan 't bestand niet gevonden worden? Heb je offline storage gebruikt en krijg je die niet (meer) geopend? Wat?

[quote]PerfectLight schreef op woensdag 29 juni 2011 @ 02:39:
  • Dit:
    PHP:
    1
    
    //*snip

    Maar dan krijg ik alleen de oproep van het script te zien in de xml, en niet wat hij na die paar seconden pas laadt.
Wat versta je onder "krijg ik alleen de oproep van het script te zien in de xml"? Je ziet een GET gebeuren (Firebug/IE F12 Dev.tools/Chrome Dev.tools/Safari Dev.tools/Opera Dragonfly/Fiddler2)? En die gaat ook naar je juiste server (dus je hebt de url google.com/calendar/feeds/... veranderd naar jedomein.nl/mijnscript.php)? En die retourneert dan wel netjes (een evt. cached versie) van de XML die eerder bij google opgehaald is? Krijg je foutmeldingen? Welke XML krijg je terug en klopt die met wat je verwacht te ontvangen? Wordt de file die als cache zou moeten dienen wel weggeschreven? Je hebt PHP's error reporting aan staan?
PerfectLight schreef op woensdag 29 juni 2011 @ 02:39:
(Of ligt het echt aan de traagheid van het inladen van de bestanden vanaf Google?)
Ik ben niet intiem bekend met Google's calender, maar ik zie zo snel geen reden waarom je die "feed" niet tijdelijk zou kunnen cachen op je eigen server (en zo effectief als "caching proxy" dienen).

Heb je, met voorgenoemde tools (of Wireshark of...) al eens gekeken waar de vertraging precies zit? Is dat in de DNS lookup? Het wachten op respons? Het verwerken van de ontvangen data?

Je zult in ieder geval al beter de problemen die je tegenkomt moeten gaan omschrijven willen we je enigszins kunnen helpen ;)

Zie ook Debuggen: Hoe doe ik dat?

[ Voor 36% gewijzigd door RobIII op 29-06-2011 03:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij