Gå til innhold

Regelmessig oppdatering, kanskje uten cron?


Anbefalte innlegg

Jeg har tidligere programmert en tjeneste for å navigere i og spille av podcaster fra nrk, mest for eget bruk. Har nå begynt å kikke litt mer på det da det viser seg at det faktisk finnes andre som bruker tjenesten. 

 

Tjenesten finner du her.

 

Problemet jeg står overfor er oppdatering av databasen. Koden er bygget opp slik at den søker igjennom rss-filer fra NRK og setter innholdet inn i databasen. Dette fungerer utmerket for hoveddelen av tjenesten nemlig nå man bare ser på et program av gangen. Da laster koden rss-filen for det valgte programmet, oppdaterer databasen og viser alle oppføringene for brukeren.

 

Problemet kommer når jeg vil implementere tjenester som går på tvers av hele databasen. For eksempel søk i alle oppføringer og så videre. Det er åpenbart en dårlig løsning at brukeren skal vente 20 - 30 sekunder på at serveren skal hente opp alle de ulike rss-filene NRK publiserer før innhold vises for brukeren.

 

Hadde tjenesten kjørt på egen server kunne jeg slik jeg har forstått det kjørt en cron-jobb som ba serveren oppdatere en gang hvert kvarter eller lignende, men det gjør den altså ikke. 

 

Kan noen tenke seg noen andre noenlunde tilfredstillende løsninger, eller er det et uløselig problem?

Lenke til kommentar
Videoannonse
Annonse

Du kan legge inn et usynlig bilde eller JavaScript-fil som i realiteten er et PHP-script. Hver gang brukeren laster inn siden, vil også dette PHP-scriptet lastes inn og kjøres i bakgrunnen, og her kan du oppdatere alle rss-filene. En god idé er at scriptet kun oppdateres hvis rss-filene er oppdatert for mer enn 1 time (eller 24 timer, kommer jo an på hvor ofte du vil at det skal bli oppdatert).

 

Tror det er vanlig å gjøre dette i JavaScript-fil, men husk å ikke legge den i <head> (legg den gjerne sist i <body>), da vil nettleseren vente på at den er ferdig lastet før den viser siden, og da er du tilbake der du startet :p

Lenke til kommentar

Artig problemstilling

Jeg så litt på nettet etter gratis cron tjenester, fant ikke så mange (les ingen)

 

Det som er litt dårlig gjort med podcast reglene er at den ikke krever noen "last update" timestamp

Men for en løsning

 

Lag et script som henter dataene si, en gang i timen (eller hvor ofte du vil)

Når en besøker siden og det er over tiden på hvor ofte det skal hentes så lastes det ned nye filer.

 

Kan vise deg litt i riktig retning, vent på edit

Lenke til kommentar

Noe sånt som det her, ca

 

<?php
function getPodcast(array $links, $LOG = FALSE) {
//How often (sec)
$often = 3600;
//How many at once
$GET = 2;
//Logfile
$logFile = 'log.txt';
$time = time();
//Get last update
$lastFile = 'last.txt';
if(!file_exists($lastFile) || (!file_exists($logFile) && $LOG)) {
	echo 'Create both '.$logFile.' and '.$lastFile;
	return FALSE;
}
if(!is_writable($lastFile) || (!is_writable($logFile) && $LOG)) {
	echo 'Set both '.$logFile.' and '.$lastFile.' writeable!';
	return FALSE;
}
//Get lastFile
$file = file($lastFile);
foreach($file as $entry) {
	$ex = explode('|',$entry,2);
	$last[$ex[0]] = str_replace("\n",'',$ex[1]);
}
foreach($links as $link) { //Run each link
	if(preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $link)) {
		$thisEntry = false;
		if(empty($last[$link])) {
			$thisEntry = true;
		} elseif(($last[$link] +$often) < $time) {
			$thisEntry = true;
		}
		if($GET > 0 && $thisEntry) {
			$rssFile = @file_get_contents($link);
			if(empty($rssFile)) {
				$GET++;
				if($LOG) {
					file_put_contents($logFile, $time.':Empty from '.$link."\n", FILE_APPEND);
				}
			} else {
				//Put the code that save the rss file here
				//Data = $rssFile
				if($LOG) {
					file_put_contents($logFile, $time.':Got data from '.$link."\n", FILE_APPEND);
				}
				$last[$link] = $time;
			}
			$GET--;
		}
	}
}

$content = '';
foreach($last as $url => $change) {
	if(strlen($url) > 10) {
		$content .= $url.'|'.$change."\n";
	}
}
@file_put_contents($lastFile,$content);
return TRUE;
}
$links = array(
'http://podkast.nrk.no/program/20_spoersmaal.rss',
'http://podkast.nrk.no/program/andakten.rss',
'http://podkast.nrk.no/program/banden.rss'
);

getPodcast($links, true);
?>

 

Hvis det er noen spørsmål så er det bare å fyre

Lenke til kommentar

Har laget en lignende løsning som dere foreslår. Den fungerer slik:

 

Har et script som først sjekker hvor lenge det er siden hver enkelt podcast ble oppdatert og hvis det er over en time blir den oppdatert. Dette scriptet har jeg så lagt inn i en iframe, med "display: none". På den måten slipper brukerne å vente på at oppdateringen skal bli ferdig før siden blir lastet.

 

Er allikevel ikke noen perfekt løsning. For det første vil det ta lang tid før nettleseren viser i statusbaren at siden er ferdig lastet, noe som kanskje gjør brukeren stresset.

 

For det andre fungerer en slik løsning best hvis det er en jevn strøm av brukere. Hvis det ikke er det og noen foretar et tekstsøk etter en nyere podcast vil jo ikke den bli med i søkeresultatet, fordi den først blir opdatert etter at siden blir vist for brukeren. Men det er jo helt klart et fremskritt. 

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...