Ik heb altijd het idee gehad dat een database een vrij trage applicatie was. Reuze handig, en als je hem goed gebruikt is er niks mis mee.
Maar nu ik aan het bouwen ben voor een vrij druk bezochte website heb ik het idee gevat om query-results te cachen.
Ik had al een database class, en daar heb ik het ingebouwd. Je kan bij een query opgeven of het cache gebruikt moet worden, of er cache gecreeerd moet worden, en wat de lifetime van het cache is.
Als je dus een bepaalde query maar een keer per dag wil uitvoeren, en het resultaat cachen roep je de class zo aan (er van uitgaande dat hij al geinitialiseerd is)
het 3e argument (false) is even niet van toepassing hier.
Dit is de functie, dan zie je wat er gebeurd
Deze functie roep ik om te benchmarken 1000 keer aan.
<Edit: KNIP Per ongeluk verkeerde results gepost... zucht (zie post 4)>
Vaag he? inlezen van het fs en unserializen is veeel trager dan een query doen aan de database...
Of doe ik het nou zo fout?
Maar nu ik aan het bouwen ben voor een vrij druk bezochte website heb ik het idee gevat om query-results te cachen.
Ik had al een database class, en daar heb ik het ingebouwd. Je kan bij een query opgeven of het cache gebruikt moet worden, of er cache gecreeerd moet worden, en wat de lifetime van het cache is.
Als je dus een bepaalde query maar een keer per dag wil uitvoeren, en het resultaat cachen roep je de class zo aan (er van uitgaande dat hij al geinitialiseerd is)
PHP:
1
2
3
| <? $DB->array_query($array, "SELECT * FROM Menu ORDER BY parentID, order", false, true, true, (24*60*60)) ?> |
het 3e argument (false) is even niet van toepassing hier.
Dit is de functie, dan zie je wat er gebeurd
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
47
48
49
50
51
52
53
54
55
| <? function array_query_append( &amp;amp;amp;$array, $SQL, $column = false, $useCache = false, $makeCache = false, $cacheTime = 0 ) { $cacheFile = ""; $buildCache = false; if ( $useCache ) { $cacheFile = $this->cacheDir . md5 ( $SQL ); if ( file_exists ( $cacheFile ) ) { // How old is the cache file? $secondsOld = time() - filemtime( $cacheFile ); // Can i use it? if ( $secondsOld < $cacheTime || $cacheTime == -1 ) { // use cache file instead of results $fp = fopen ($cacheFile, "r"); flock ( $fp, LOCK_SH ); $serialized = fgets ( $fp, 1048576 ); fclose ( $fp ); $array = unserialize($serialized); return true; } } $buildCache = true; } $result =&amp;amp;amp; $this->query( $SQL ); // Grote knip, hier gebeurd een hoop wat niet ter zake doet, er komt een variabele $array uit die het resultaat bevat if ( $useCache &amp;amp;amp;&amp;amp;amp; $makeCache ) { if ( $buildCache ) { $serialized = serialize( $array ); $fp = fopen ($cacheFile, "w"); flock ( $fp, LOCK_EX ); fputs ( $fp, $serialized, strlen ( $serialized ) ); fclose ( $fp ); } } return true; } ?> |
Deze functie roep ik om te benchmarken 1000 keer aan.
<Edit: KNIP Per ongeluk verkeerde results gepost... zucht (zie post 4)>
Vaag he? inlezen van het fs en unserializen is veeel trager dan een query doen aan de database...
Of doe ik het nou zo fout?