Toon posts:

Google Calendar local cache voor sneller laden

Pagina: 1
Acties:

Onderwerpen


  • PerfectLight
  • Registratie: December 2009
  • Laatst online: 27-05 09:38
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]


  • RobIII
  • Registratie: December 2001
  • Laatst online: 14:51

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

[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.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij



Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee