Aide - Recherche - Membres - Calendrier
Version complète : Le Plus Rapide
La Communauté TitaXium > Service Communication > Espace Developpement
Antoine_935
En PHP, est-il plus rapide d'ouvrir 3 fichiers et de faire des recherches de char sur un plus petit texte, ou d'ouvrir un seul fichier et de faire une grosse recherche ?
en clair : qu'est-ce qui prend le plus de temps ? ouvrir ou chercher ?

au passage : voici le code de mon generateur de page (en construction):

Code
<?php
class phtpl {
    var $title = FALSE;
    var $footer = FALSE;
    var $content = FALSE;
    var $menu = FALSE;
    var $rendered = FALSE;
    
    function render() {
 $html_header = readfile("template/header.html");
 $html_content = readfile("template/content.html");
 $html_footer = readfile("template/footer.html");
 $this->rendered =  str_replace("{title}", $this->title, $html_header);
 $procont = str_replace("{menu}", $this->menu, $html_content);
 $this->rendered += str_replace("{content}", $this->content, $procont);
 $this->rendered += str_replace("{footer}", $this->footer, $html_footer);
 return $this->rendered;
    }
}
?>


le fichier header.html contient le char {title} etc...
seulement, PHP ne remplace pas ce que je lui demande (donc {title} par $objet->titre etc...)
Pourquoi ? ou est mon erreur ?

voila le code qui invoque la fonction :
Code
$phtpl = new phtpl();
$phtpl->title = "Gamecrea test title";
$phtpl->footer = "Gamecrea test footer";
$phtpl->menu = "<li><a href=\"#\">Lien</a></li><li><a href=\"#\">Lien</a></li><li><a href=\"#\">Lien</a></li><li><a href=\"#\">Lien</a></li>";
$phtpl->content = "salut";
$phtpl->render();


au final, il me renvoie une page contenant {title}, {content} etc, et pas ce par quoi il aurait du les remplacer
Xtouch
Pour répondre à la première question, pour moi c'est très clairement l'ouverture d'un fichier qui est l'action la plus lourde dans ton script.

Il vaut mieux, je pense n'ouvrir qu'un seul fichier.
Puisque bon, après faire un str_replace dans une variable, même grosse, c'est ce que l'on va appelé du quasi instanné.

Mais attention, je parle bien du str_replace, pas des autres fonctions du style preg_replace :innocent:
Antoine_935
bon, ok, ca c'est corrigé. reste l'autre bug mnt...

Code
<?php
class phtpl {
    var $title = FALSE;
    var $footer = FALSE;
    var $content = FALSE;
    var $menu = FALSE;
    var $rendered = FALSE;
    
    function render() {
 $html = readfile("template/template.html");
 $this->rendered = str_replace("{title}", $this->title, $html);
 $this->rendered = str_replace("{menu}", $this->menu, $html);
 $this->rendered = str_replace("{content}", $this->content, $html);
 $this->rendered = str_replace("{footer}", $this->footer, $html);
 return $this->rendered;
    }
}
?>


j'ai essayé de créer une fonction internet pour définir la variable content, mais ca ne marche pas.
j'ai aussi essayé de remplacer les FALSE par des "", mais ca ne marche pas non plus. A moins que apache ne mette les fichiers inclus avec "require()" en cache, je ne pige rien sad.gif


EDIT : je viens de me rendre compte que PHP rajoute un nombre variable selon le code à la fin de la page, après </html> : ici 1244
Digwele
Le mieux serait d'utiliser le système de template fourni par PHP dans ton cas je pense ^^.
Antoine_935
sans doute, mais je préfère développer mon propre code.
Bon, je vais en faire une fonction pour le moment, et je repasserai ca en objet plus tard.

pfffff ! la barbe, meme avec une bete fonction intégrée à la page index.php ca ne marche pas ! l'erreur doit etre dans le str_replace, mais où exactement ?
mOg
le nombre qui est retourné est le nombre d'octets lu par la fonction readfile, cf manuel smile.gif

Je te conseille d'utiliser file_get_contents() qui est comem readfile() mais qui renvoie le fichier sous forme de string.

Sinon, voila un petit exemple rapide de comment j'aurais vu ta classe phtpl et son appel.

la classe phtpl
Code
<?php
class phtpl {
var $title;
var $footer;
var $content;
var $menu;
var $rendered = "";

    function render() {
 $html = file_get_contents("template.html");
 $this->rendered .= str_replace("{title}", $this->getTitle(), $html);
 return $this->rendered;
    }

    // Definit le titre
    function setTitle($var) {
 $this->title = $var;
    }

    // Récupère le titre
    function getTitle() {
 return $this->title;
    }
}
?>

le fichier qui instancie la classe
Code
<?php
    include_once('phtpl.php');
    $phtpl = new phtpl();
    $phtpl->setTitle("Gamecrea test title");
    echo $phtpl->render();
?>


A toi d'adapter avec tes parametre set variables smile.gif C'zest une methode, il en existe d'autres mais celle-ci me parait adaptée a tes besoins.
elf
Sinon k'ai programme il y a trois jour une petite classe tour loader des templatesm si tu veux je te passe le code des que je rentre a la maison et tu vera si il y a des difference qui peuvent poser le probleme
Antoine_935
Citation (mOg @ mardi 20 septembre 2005 à 01h00)
le nombre qui est retourné est le nombre d'octets lu par la fonction readfile, cf manuel smile.gif

*


C'est le readfile qui posait le problème laugh.gif
j'ai remplacé par
Code
$file = fopen("template/template.html", 'r');
 $html = fread($file, filesize("template/template.html"));
 fclose($file);

et ca marche !

et voila la cause : "readfile() lit le fichier filename et l'envoie à la sortie standard."

Merci Mog
mOg
c'est preferable d'utiliser file_get_contents() smile.gif
Antoine_935
sans doute, mais je me restreinds au PHP4 de base, et cette fonction n'est pas dedans smile.gif
ca permet plus de portabilité.
elf
Voilà le code peut être réutilisé mais comme ça tu vois comment j'ai fais, c'est asser simple mais ça me conviens plus que a merveille...

Sachant que les tempates resemble a ça:
Code
<html><head>
<s-BALSIE_STML-s>
</head>
<body>
<div id="content"><s-CONTENT-s>
</body></html>


et l'array passé dans le constructeur à cela:
Code
array(
'BALISE_STML' => '<meta <!--whatever--> />',
'CONTENT' => '<p>lorem ipsum</p>'
)


C'est très très extensible car 1erement il suffit de changer l'array en fonction de ses besoins pour remplacer n'importe quelle balise Stml et 2emement le navigateur ne prens pas en compte les balise STML qui n'ont pas étée remplacée par le script (pas dans l'array)

La classe:

Code
<?php

/*

STML - Classe pour parser le STML

Par Kenneth Ballenegger - SeoxyS

Copyright (c) 2005 - SeoSoft Inc. - SeoSoft.info
*/

class STML{
    
    var $parsArr;
    
    function STML($parsArrArg){
 $this->parsArr = $parsArrArg;
    }
 
    function ParseWithFile($file){
 return $this->ParseWithText(file_get_contents($file));
    }
    
    function ParseWithText($text){
 $result = $text;
 foreach($this->parsArr as $key => $value ){
     $result = str_replace('<s-'.$key.'-s>', $value, $result);
 }
 return $result;
    }
}

?>


Enjoy!!!

Je donne un example d'utilisation demain depuis l'école car la je vais y aller

En fait je créerais un petit sujet, bof on verra.

++
K-jasi
Pour ce qui est des templates et moteurs qui gèrent tout cela, je crois que smarty est devenu une référence. Il précompile les templates en fichiers php quasi exécutables, ce qui fait qu'il est super performant. Il en est d'ailleurs devenu le moteur de templates officiel de PHP. Un petit coup d'oeil par là n'est superflu pour personne wink.gif
Smarty (la doc francaise est vachement bien faite).
elf
Oui tu as raison mais j'ai pas dis que une fonction que j'utilise paralellement a ma classe mais que je pourrais integrer dans ma classe. Et ca execute tout le code PHP d'un fichier sans parseur en trois lignes de code:
Code
function loadFileInStrAndExecutePHP($path){
ob_start();
include($path);
return ob_get_clean();
}


Ce code retourne le contenu du fichier $path en aiant execute le PHP dans une string.

Je vais faire un petit sujet pour cela... lol
Antoine_935
merci a tous pour vos infos, mais le problème rencontré était plus que stupide, et est résolu.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2010 Invision Power Services, Inc.