Include - if/else - Cache de fichier

gils57
Invité n'ayant pas de compte PHPfrance

23 sept. 2014, 13:57

Bonjour,

j'ai besoin de votre aide concernant include et les conditions pur mettre en place un cache de fichier.
Je souhaite include au début du fichier meta.php (qui est lui même appelé sur toutes les pages), le code cache de fichier suivant :
<?php
	$nom_page = basename($_SERVER['PHP_SELF']); 
	$nom_page = str_replace('php','html',$nom_page); 
	$cache = "$_SERVER[DOCUMENT_ROOT]/cache/$nom_page";
	$expire = time() - 108000 ;
	 
	if(file_exists($cache) && filemtime($cache) > $expire){
		readfile($cache);
		}
	else{
		ob_start();
?>

Dans le module footer.php, j'inclue le reste du code cache de fichier soit :
<?php
$tampon = ob_get_contents(); 
file_put_contents($cache, $tampon); 
ob_end_flush();
ob_end_clean(); 
}
?>
Le code de la page structurellement parlant ressemble à cela :
<?php
session_start();
include("MODULES/meta.php");
?>

entre balises body (php, mysql ...)

<?php
include("MODULES/footer.php")
?>
PROBLEME : le code m'indique que je n'ai pas fermé le else (or celui est bien fermé dans l'include qui termine le cache)

Parse error: syntax error, unexpected end of file in /xxx/xxx/xxx/MODULES/cacheA.php on line 12

Seule solution :que j'ai trouvé, ouvrir chaque page et insérer manuellement le code cache sans passer par les include ...

Si vous avez une solution, je suis preneur !

merci d'avance

Eléphant du PHP | 151 Messages

23 sept. 2014, 14:31

Et le code de ton cacheA.php ?
Développeur d'applications pour intranets industriels (IHM), DBA Oracle, auto entrepreneur. Je fuis les frameworks car je pense comme Rasmus Lerdorf : "all PHP frameworks suck"...
Je me suis lancé dans la reprise du projet PhpMyNewsletter (GNU GPL), que je vous invite à essayer.

echo ($user=='enregistré?"je t'aide":"je t'aide pas !");

gils57
Invité n'ayant pas de compte PHPfrance

23 sept. 2014, 15:05

Voici :
<?php
        $nom_page = basename($_SERVER['PHP_SELF']);
        $nom_page = str_replace('php','html',$nom_page);
        $cache = "$_SERVER[DOCUMENT_ROOT]/cache/$nom_page";
        $expire = time() - 108000 ;
         
        if(file_exists($cache) && filemtime($cache) > $expire){
                readfile($cache);
                }
        else{
                ob_start();
?>
merci

ynx
Mammouth du PHP | 586 Messages

23 sept. 2014, 16:13

Salut,

Effectivement ton fichier meta.php est exécuté directement lors de l'inclusion de celui-ci, or à ce moment le fichier footer.php n'est pas encore inclus et il y a donc une erreur de syntaxe (if non fermé).

Tu ne peux donc pas fermer le if dans le fichier footer.php, mais tu peux y effectuer la même condition :
meta.php
<?php
        $nom_page = basename($_SERVER['PHP_SELF']);
        $nom_page = str_replace('php','html',$nom_page);
        $cache = "$_SERVER[DOCUMENT_ROOT]/cache/$nom_page";
        $expire = time() - 108000 ;
         
        if(file_exists($cache) && filemtime($cache) > $expire){
                readfile($cache);
                }
        else{
                ob_start();
        }
// ?> la balise de fermeture php est facultative ici : en ne la mettant pas on évite aussi d'afficher des lignes vides
footer.php
<?php
// condition inverse : ce qui équivaut au bloc else de meta.php
if(!file_exists($cache) || filemtime($cache) <= $expire) {
   $tampon = ob_get_contents();
   file_put_contents($cache, $tampon);
   ob_end_flush();
   ob_end_clean();
}
?>
Nous pourrions même optimiser légèrement ceci en utilisant un booléen plutôt que revérifier l’existence et la date du fichier :
meta.php
<?php
        $nom_page = basename($_SERVER['PHP_SELF']);
        $nom_page = str_replace('php','html',$nom_page);
        $cache = "$_SERVER[DOCUMENT_ROOT]/cache/$nom_page";
        $expire = time() - 108000 ;

        // le cache est désactivé par défaut
        $caching = false;

        if(file_exists($cache) && filemtime($cache) > $expire){
                readfile($cache);
        }
        else{
                $caching = true; // on active le cache
                ob_start();
        }
?>
footer.php
<?php
if($caching) {
   $tampon = ob_get_contents();
   file_put_contents($cache, $tampon);
   ob_end_flush();
   ob_end_clean();
}
?>
Bonne journée

gils57
Invité n'ayant pas de compte PHPfrance

23 sept. 2014, 16:55

Je n'ai qu'un mot, BRAVO !

merci beaucoup !

c'est génial, depuis le temps que je cherchai une solution efficace à ce point.

As tu des connaissances par rapport au modèle de cache smarty / POO propre à prestashop ?

je suis à la recherche d'un développeur bien meilleur que moi ... pour intervenir à certaines occasions voire me former contre rémunération bien entendu.

Cordonnées sur 57informatique

Encore merci.

gils57
Invité n'ayant pas de compte PHPfrance

23 sept. 2014, 17:29

Il y a un petit problème encore.

Le cache fonctionne bien mais le contenu de la page est dupliqué, 2X <body></body>

Sûrement une petite erreur qui se balade ...

ViPHP
xTG
ViPHP | 7331 Messages

23 sept. 2014, 17:35

Il y a un petit problème encore.

Le cache fonctionne bien mais le contenu de la page est dupliqué, 2X <body></body>

Sûrement une petite erreur qui se balade ...
Deux personnes qui ont fait une requête en même temps ?
Car sinon je ne vois pas avec le code présenté.

ynx
Mammouth du PHP | 586 Messages

23 sept. 2014, 17:38

Ah oui effectivement, il faut arrêter l'exécution de ton script après avoir chargé le fichier en cache, sinon plus aucun intérêt à utiliser le cache si on refait le traitement de la page à chaque fois ;)
readfile($cache);
// le fichier en cache est chargé, on s'arrête ici
exit();
Désolé pas de grandes connaissances sur smarty ou prestashop.

Bonne continuation

gils57
Invité n'ayant pas de compte PHPfrance

23 sept. 2014, 18:28

extra !

merci pour tout.