Ik haal als eerste de gegevens uit een db, deze zet ik in een bestand (php) netjes in een tabeltje. Dit tabeletje sla ik op als bestand "ranks.php". Deze ranks update elk kwartier een nieuw bestand. Dit gaat allemaal helemaal goed geen vragen over werkt ook helemaal.
Nu is mijn vraag, ik wil 1 gegeven opvragen in die tabel. Hoe moet ik dat doen? Ik kan e.v.t.w ik heb al geprobeer array te gebruiken maar dit werkt maar 1x. Iemadn een idee hoe ik het kan doen?
In die tabel moeten ze allemaal blijven staan :), ik moet dus eigelijk uit die tabel die gemaakt is de gegevens halen. Ik gebruik het volgende script. Ik denk dat ik hieronder iets bij moet zetten:).
function cacheranks() {
ob_start(); // laat output buffer toe (activeren)
setlocale(LC_TIME, "dutch"); // nederlands tijdsformaat instellen
$result = mysql_query("SELECT * FROM level ORDER BY id ASC LIMIT 0,10");
?>
<table width="200" border="1">
<tr>
<th scope="col">ID</th>
<th scope="col">NAAM</th>
</tr>
<?
while($script = mysql_fetch_object($result)) {
?>
<tr>
<td><? echo("$script->id");?></td>
<td><? echo("$script->naam");?></td>
</tr>
<?
}
?>
</table>
<?
$tijd = time();
$tijdtoen = tijd($tijd);
// einde lus
$uitvoer = ob_get_contents(); // steekt gans de buffer in variabele $uitvoer
ob_end_clean(); // maakt output buffer leeg en de-activeert het
// Nu kunnen we kiezen: ofwel steken we gans de uitvoer in een bestand op de server (in folder), ofwel schrijven we het netjes weg naar een configuratie rij in je mysql tabellen.
// Maar aangezien snelheid primeert in dit geval: steek het maar in een bestandje: cache.inc.php
$cache = fopen("include/gegevens/cacheranks.php","w");
fputs($cache, $uitvoer); // wegschrijven in bestand
fclose($cache); // sluit bestandsverbinding
}
@Maarten de Boer dit is niet wat ik wil. Nu vraag ik de gegevens op die NU in de db staan. Dat is niet mijn bedoeling. Ik wil mijn gegevens opvragen met een kwartier vertaring (om minder serverload te krijgen later). Ik vraag dus d.m.v dit script gegevens op uit de db en zet dit netjes in een tabeletje die ik later dus uitlees.
Als ik nu gegevens opvraag door bovenstaande manier heb ik er nog niks aan:).
Ik zou gewoon een functie maken die kijkt wat de aanmaaktijd van het cache-bestand is ([php]filemtime[/php]) Is die ouder dan een bepaald moment dan haalt hij de gegevens uit de database en slaat ze (via serialize, of meteen direct, kan ook) op in het bestand en returnt/echo't ze.
Bestaat het bestand wel al, dan kan je het met [php]file_get_contents[/php] teruggeven, of sneller, met [php]fopen[/php] & [php]fpassthru[/php] meteen naar de output(buffer) doorsturen.
Achteraf wel even testen of het daadwerkelijk sneller is en minder schijfactiviteit oplevert natuurlijk.
Ik snap het. Je wilt om het kwartier je bestand vernieuwen vanuit je DB, maar de bezoeker van je pagina moet de gegevens uit je cachebestand krijgen.
Dan zou ik het nooit als HTML tabel in een bestand opslaan, maar eerder op een CSV achtige manier. Zelf gebruik ik dan als veldscheidingsteken meestal een | (pipe), die komt in normale tekst nooit voor. Als recordscheidingsteken gebruik je een harde return.
Je bestand ziet er dan zo uit:
1|Jan
2|Piet
3|Klass
Nu kun je het openen met:
<?php
$lines = file ('cacheranks.csv');
$ranks = array ();
foreach ($lines as $value) {
list ($id, $naam) = explode ('|', $value);
$ranks[$id] = $naam;
}
?>
Als je nu de gegevens van ID=1 wilt hebben doe je eenvoudig $ranks[1]
[edit]Edit:[/edit] overigens vraag ik me af of je op deze manier werkelijk minder serverload krijgt. Of je nu de gegevens uit een DB leest, of uit een CSV-bestand. Een DB is er speciaal voor ontworpen en werkt met indexen en dergelijk om het opvragen van data te versnellen.
Selecteren van gegevens is inderdaad typisch voor de database. Ik zou dat zeker niet zo gaan optimaliseren. Ga dan kijken naar het cachen van het eindresultaat, vooral de juiste headers meesturen om zo gebruik te maken van de cache van de browser. Dat zal vele malen meer resultaat opleveren.
Daarna je queries verbeteren (geen * gebruiken, alleen selecteren wat je nodig hebt, werken met LIMIT enz. enz.)
Daarbij, een beetje database heeft zelf ook al allemaal vormen van cachen en bufferen. Maak je daar maar geen zorgen om.
Ik vermoed als de website klaar is dat bepaalde gegevens (die ik dus nu cache). snel al tot 1.000 keer per kwartier worden opgevraagt:). Dan lijkt mij dat het iets sneller gaat d.m.v een cache bestand met een kleine vertraging:). zodat mensen niet 1.000x gaan klikken zodat de gegevens veranderen.