[php] Webpagina updaten en cachen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Middels onderstaande php code probeer ik een pagina te updaten. Echter ontstaat op dit moment duidelijke en heel vreemd probleem nu blijkbaar de website meer bezocht wordt. Het lijkt erop dat als twee bezoekers precies op hetzelfde moment opvragen dat zaakjes ineens dubbel gedaan worden, en dat is niet de bedoeling. Is er ook een mogelijkheid om iets "sneller" te locken ofzo of blijf je altijd met dit probleem zitten op de manier dat ik dit wil doen?

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$filename4 = "cache/".$page.".cache";
$include = "cache/".$page;

$age = 3600; // tijd

if (file_exists($filename4)) {   // bestaat de cache reeds?
    $mtime = filemtime($filename4);
    $fileage = time() - $mtime;
    if ($fileage < $age) {  // is de cache gedateerd?
        $usedfile = true;
    } else { $usedfile = false;}

    include ($filename4);
    
    flush();    
    ignore_user_abort(1);
        
    $outputfile = false;    
        
} else {
    
    $usedfile = false;
    $outputfile = true;
    
} 

if ($usedfile == false) {
    ob_start();
// pagina




    $output = ob_get_clean();
    $file = fopen( $filename4, 'w' ); 
    fputs($file, $output);
    fclose($file);
    
    
    if ($outputfile == true) {
        
        
include ($filename4);

    }
}

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Je lockt de file nu toch nergens?

PHP:
1
2
3
4
5
6
7
8
9
10
$file = fopen( $filename4, 'w' );

if (flock($file, LOCK_EX)) {
    fputs($file, $output);
    flock($file, LOCK_UN); // release the lock
} else {
    echo "Couldn't lock the file !";
}

fclose($file);

Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
De term 'locken' gebruikte ik in mijn stukje om iets duidelijker te maken wat ik wil. Op de pagina die gecached wordt worden meerdere zaken bijgewerkt. Dit bijwerken op de pagina moet echter maar één keer gebeuren. Wat er nu gebeurd is dat als de pagina gedateerd is dat alle bezoekers van die pagina de pagina gaan updaten totdat het bestandje nieuw is. Ik weet dan ook niet of dit met locken op te lossen is. Ik zoek iets dat voorkomt dat zegmaar een update functie van een cache achter elkaar uitgevoerd wordt door bezoekers (eerste hit van .php gaat de functie doen elke hit die volgt niet). Ik ga toch eens kijken of de "flock" iets is. Maar ook hier kunnen twee snelle hits achter elkaar "binnenkomen" in de update functie.

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

Verwijderd

ALs ik het goed begrijp moet je enkel snel weten dat een bestand gelogt is om te cachen? iig, sql is zeer snel.. Sneller dan een bestand checken. Dus als dit is wat je bedoelt zal ik sql gebruiken met simpel een BOOL om te kijken of hij wel of niet gelockt is.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 18 juni 2007 @ 09:32:
ALs ik het goed begrijp moet je enkel snel weten dat een bestand gelogt is om te cachen? iig, sql is zeer snel.. Sneller dan een bestand checken. Dus als dit is wat je bedoelt zal ik sql gebruiken met simpel een BOOL om te kijken of hij wel of niet gelockt is.
Dat is natuurlijk complete onzin; een filesystem is (in essentie) ook een database. Kijken of een file bestaat en dan al of niet gelockt is laat je in dat geval dus ook over aan het FS en dan ga je niet de dikke overhead van een SQL server gebruiken om te kijken of een file gelockt is :X

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


Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Zit ik dan toch weer iets te verzinnen wat helemaal niet kan?

Ik heb op de betreffende pagina zaken staan die geupdated als de frontpage cache te oud is (database bijgewerkt, nieuws, etc.) Als dit dubbel gebeurd dan loopt het zaakje in de soep. Cron heb ik aan zitten denken, maar dan wordt alles geupdated ook als er helemaal geen bezoekers zijn, beetje zonde van de capaciteit om bijvoorbeeld elke 10 minuten een cron te laten draaien die best wat data moet verzetten.

Hoe kan ik dit het beste oplossen? Is er niet iets op te verzinnen dat de seconde nauwkeurig net die eerste bezoeker de update triggerd en de rest gewoon de cache blijven zien (al is ie dan wel gedateerd)?

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Tja, lock krijgen, check uitvoeren, cachedate aanpassen, lock vrijgeven, eventueel nieuwe versie produceren. Dat lijkt me een duidelijk stappenplan. Zorg er trouwens voor dat je de cachedate een hoge resolutie geeft en/of een veilige marge.

Moet heel erg de verleiding weerstaan om een opmerking te maken over een missende applicationscope in php

[ Voor 14% gewijzigd door Janoz op 18-06-2007 09:57 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1