Php opslaan als html in bestand

  • Onderwerp starter Onderwerp starter baws
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

baws

Terugkerende gebruiker
Lid geworden
9 apr 2010
Berichten
1.258
Hallo,

Ik heb een website met een footer en een menu met merken en series erin.

Omdat er vaak nieuwe merken en series bij komen worden deze opgehaald via php uit de database het is dus een dynamisch menu.

Wat ik wil doen is als ik een merk toevoeg een bestand (menu.php) schrijven met de inhoud van de uitkomst van de query in html.
Dus dat alles wat via php gaat al op de server wordt opgeslagen als html, en de query dus alleen met een update hoeft te worden uitgevoerd in plaats van op elke pagina 2 x (menu en footer) is dit mogelijk?
later haal ik deze gegevens op met een request wat sneller/minder belastend is dan een query.

Mvg
 
Oftewel: caching?

Zoiets kun je doen:
cache.class.php
PHP:
class Cache
{
    public static function getMenu()
    {
        // Controleer op een cache, wordt bijgewerkt wanneer het bestand ouder is dan 10 minuten
        $file = 'cache/menu.php';
        if(file_exists($file) && (filemtime($file) > strtotime('-10 minute'))) {
            $response = file_get_contents($file);
        } else {
            // Hier maak je de query en ga je de inhoud van menu.php genereren. Die inhoud zet je in de variabele $response
            $response = '<b>Voorbeeld '. date('d-m-Y H:i:s') .'</b>';
            // Controleer of de cache-map bestaat, zo niet maak hem aan.
            if(!is_dir('cache')) {
                mkdir('cache');
            }
            // Sla de HTML op
            file_put_contents($file, $response);
        }
        return $response;
    }
}
Als je dit bestandje via require_once() opneemt in je pagina kun je het menu zo opvragen:
PHP:
echo Cache::getMenu();
 
Ok dus als ik het goed begrijp kijkt hij of het bestand de laatste 10 minuten is aangepast zo niet dan update hij hem en laad hem erna, als hij wel de laatste 10 minuten geupdate is dan laad hij het bestand wat gemaakt is vanuit de query.

moet $file = 'cache/menu.php'; er een / voor zodat het altijd vanuit de root is, want ik wil het menu uiteraard ook op andere paginas gebruiken die niet vanuit de root laden bijvoorbeel website.nl/paginas/media/index.php en website/index.php
 
Wanneer de wijzigdatum van het bestand langer dan 10 minuten geleden is geweest dan gaat hij de query uitvoeren en het bestand bijwerken, zo niet dan laad hij gewoon het bestand in.

Je zou er inderdaad een '/' voor kunnen zetten, volgens mij is het nu afhankelijk van de locatie van cache.class.php. Als die in de root staat dan zal hij daar ook de cache-map aanmaken ongeacht vanuit welk bestand de functie wordt aangeroepen.
 
Super precies wat ik wou ! , is het ook mogelijk om 150 regels code (php en html) makkelijk te te kennen aan de variabel $response
 
PHP:
class Cache
{
    public static function getMenu()
    {
        // Controleer op een cache, wordt bijgewerkt wanneer het bestand ouder is dan 10 minuten
        $file = 'cache/menu.php';
        if(file_exists($file) && (filemtime($file) > strtotime('-10 minute'))) {
            $response = file_get_contents($file);
        } else {
            // Hier maak je de query en ga je de inhoud van menu.php genereren. Die inhoud zet je in de variabele $response
            $response = ''; // Belangrijk!

            // Elke keer als je wat wilt toevoegen doe je dit:
            $response .= 'Extra tekst<br />';
            $response .= 'Extra tekst';
            // Controleer of de cache-map bestaat, zo niet maak hem aan.
            if(!is_dir('cache')) {
                mkdir('cache');
            }
            // Sla de HTML op
            file_put_contents($file, $response);
        }
        return $response;
    }
}
 
als ik in het bestand een query wil doen. en ik include / require het database bestand dat ik overal gebruik zegt hij : call to a member function query on non object, hij heeft dus geen verbinding lijkt het.
 
Als de verbinding niet binnen de Cache-klasse tot stand wordt gebracht wordt het hem niet inderdaad.
Variabelen die buiten deze klasse aangemaakt worden kun je niet in de klasse gebruiken.

Hoe ziet je code er nu uit?
 
PHP:
<?
$path = $_SERVER['DOCUMENT_ROOT'];
require_once "$path/admin/script/mysqli.php";
class Cache
{
    public static function getMenu()
    {
        // Controleer op een cache, wordt bijgewerkt wanneer het bestand ouder is dan 10 minuten
        $file = 'cache/menu.php';
        if(file_exists($file) && (filemtime($file) > strtotime('-10 minute'))) {
            $response = file_get_contents($file);
        } else {
            // Hier maak je de query en ga je de inhoud van menu.php genereren. Die inhoud zet je in de variabele $response
            $response = '';
			$query = "SELECT * from Stijlen ORDER BY StijlNaam";
			if ($result = $db->query($query)) 
			{
				while ($row = $result->fetch_assoc()) 
				{
					$response  .= "<li><a href=\"/paginas/stijl/stijl.php?id=".$row['StijlId']."\">".$row['StijlNaam']."</a></li>";
					
				}
				$result->free();
			}
			$response .= "</ul></li><li>";
			
			
            // Controleer of de cache-map bestaat, zo niet maak hem aan.
            if(!is_dir('cache')) {
                mkdir('cache');
            }
            // Sla de HTML op
            file_put_contents($file, $response);
        }
        return $response;
    }
}

?>
 
Laatst bewerkt:
Ik ben het aan het proberen met een enkele query dus nog niet het hele script van 150 regels
 
Waarschijnlijk is een statische functie dan niet handig in dit geval.

Probeer dit eens:

cache.class.php
PHP:
<?php
class Cache
{
    protected $database;

    public function __construct($mysqli)
    {
        $this->database = $mysqli;
    }

    public function getMenu()
    {
        // Controleer op een cache, wordt bijgewerkt wanneer het bestand ouder is dan 10 minuten
        $file = 'cache/menu.php';
        if(file_exists($file) && (filemtime($file) > strtotime('-10 minute'))) {
            $response = file_get_contents($file);
        } else {
            // Hier maak je de query en ga je de inhoud van menu.php genereren. Die inhoud zet je in de variabele $response
            $response = '<ul class="menu">';
			$query = "SELECT * from Stijlen ORDER BY StijlNaam";
			if ($result = $this->database->query($query)) 
			{
				while ($row = $result->fetch_assoc()) 
				{
					$response  .= "<li><a href=\"/paginas/stijl/stijl.php?id=".$row['StijlId']."\">".$row['StijlNaam']."</a></li>";
					
				}
				$result->free();
			}
			$response .= "</ul>";
			
			
            // Controleer of de cache-map bestaat, zo niet maak hem aan.
            if(!is_dir('cache')) {
                mkdir('cache');
            }
            // Sla de HTML op
            file_put_contents($file, $response);
        }
        return $response;
    }
}

index.php
PHP:
<?php
$path = $_SERVER['DOCUMENT_ROOT'];
require_once "$path/admin/script/mysqli.php";
require_once('cache.class.php');

$db = new mysqli();
$cache = new Cache($db);
echo $cache->getMenu();
 
Ik krijg nu de melding:

Warning: mysqli::query(): invalid object or resource mysqli in /home/instapt35/domains/sanisfeer.nl/public_html/admin/script/cache.php on line 22


met op regel 22 van cache.php

if ($result = $this->database->query($query))
 
Je hebt er ook voor gezorgd dat in index.php de variabele $db een correct mysqli-object is?
 
Ja ik gebruikte daar al een opdracht met $db nu werkt het ineens wel maar nou zijn de querys die eronder komen niet meer werkend. error Warning: mysqli::query(): invalid object or resource mysqli in ]l/public_html/index.php on line 101

En hij voert de query niet uit want in menu.php staat nou alleen <ul class="menu"></ul>

edit:

Alleen als ik refresh na de error (zie bericht hiervoor) dan krijg ik de error niet , heb de tijd op -1 ingesteld om te testen en dan krijg ik hem na 1 minuut 1 x wel en daarna niet.


het lijkt dus dat de database connectie helemaal weg gaat.
 
Laatst bewerkt:
Ah ik heb het denkik (voor een deel ) ik heb $db = new mysqli(); omdat er al een bestaande verbinding was en nu geeft hij maar een stijl terug, terwijl dit er meerdere zouden moeten zijn.
 
Oplossing

Ik heb het uiteindelijk werkend gekregen:

PHP:
<?php

class Cache
{
    protected $database;
 
    public function __construct($mysqli)
    {
        $this->database = $mysqli;
    }
 
    public function getMenu()
    {
        // Controleer op een cache, wordt bijgewerkt wanneer het bestand ouder is dan 10 minuten
        $file = 'cache/menu.php';
        if(file_exists($file) && (filemtime($file) > strtotime('0 minute'))) {
            $response = file_get_contents($file);
        } else {
            // Hier maak je de query en ga je de inhoud van menu.php genereren. Die inhoud zet je in de variabele $response
            $response = '<ul class="menu">';
            $query = "SELECT * from Stijlen ";
			$i  = 0;
            if ($result = $this->database->query($query)) 
            {
                while ($row = $result->fetch_assoc()) 
                {
                  $response .= "<li><a href=\"/paginas/stijl/stijl.php?id=".$row['StijlId']."\">".$row['StijlNaam']."</a></li>";
                    
                }
                $result->free();
            }
            $response .= "</ul>";
            
            
            // Controleer of de cache-map bestaat, zo niet maak hem aan.
            if(!is_dir('cache')) {
                mkdir('cache');
            }
            // Sla de HTML op
            file_put_contents($file, $response);
        }
        return $response;
    }
}

En dan draai ik het in menu.php op de plaats van dit menu item met.

PHP:
	$path = $_SERVER['DOCUMENT_ROOT'];
	
	require_once("$path/admin/script/cache.php");
	$cache = new Cache($db);
	echo $cache->getMenu();
 
Oei ik ben erachter gekomen dat hij nu in elke map de map cache heeft aangemaakt.
dit is omdat hij $file = 'cache/menu.php'; gebruikt.
Ik heb al geprobeerd er /cache/menu.php van te maken maar dit heeft geen nut. dan krijg ik: een error file not exist.
ik heb ook al geprobeerd om van $file
PHP:
$path = $_SERVER['DOCUMENT_ROOT'];
        $file = $path.'/cache/menu.php';

te maken maar dan maakt hij nog een map cache aan in de map waar het huidige bestand staat maar geen bestand menu.php
 
Laatst bewerkt:
Heb je wel schrijfrechten aan het mapje toegekend?
 
Ja maar hij maakt het steeds op de verkeerde locatie an het moet eigenlijk altijd in dezelfde map root/cache/menu.php maar nu doet hij het gewoon in de map waar het huidige bestand staat ook met gebruik van $path
 
Dan wordt het een kwestie van debuggen en achterhalen waar ie naar verwijst.

PHP:
class Cache
{
    protected $database;
 
    public function __construct($mysqli)
    {
        $this->database = $mysqli;
        var_dump(path_info('/'));
    }

    ...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan