IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Système] require_once à partir d'une variable ?


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut [Système] require_once à partir d'une variable ?
    Bonjour à tous,

    Oui j'aime faire des trucs compliqués !

    Petit problème du jour :

    J'ai une variable $str qui contient du code php et plus particulièrement, la définition d'une classe, fonction etc... Pour simplifier, c'est comme si j'avais ouvert un fichier php dans la variable $str.

    Est-il possible d'effectuer un require_once non pas à partir d'un fichier php mais à partir de cette variable $str ?


    Pouquoi ?

    J'ai une class contenue dans un fichier php dédié qui est chargée à chaque requête. Je possède un système de cache mémoire (voir ici) et j'aimerais utiliser la cache pour y mettre cette class. Cela résultera par un accèes fichier en moins pour chaque requête ce qui n'est pas négligeable.

    Es-ce possible ou suis-je entrain de rêver à php7 ?

    Merci,

  2. #2
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Si $str est une chaine de caractères qui contient enfait du code php, tu peux utiliser la fonction eval() mais elle est plutot gourmande.

    Pourquoi ne pas plutot stocker un résultat html ou bien enregistrer ton php dans un fichier à inclure ? Ce serait surement moins gourmand en ressources et tout aussi efficace.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Merci,

    En fait là je pensais utiliser cela pour des classes et fonctions de validation de requête de l'utilisateur.

    Pour chaque requête j'ai un id module-action-etape et pour chaque id j'ai une fonction de validation qui vérifie la présence des champs obligatoires et le type et/ou valeurs de tous les champs qui peuvent passer en get ou en post ainsi que des contrôles plus précis et en rapport avec le contexte. J'ai séparer ces fonctions de validations du reste de mon code pour pouvoir de manière automatique et systématique appeler la fonction de validation en fonction de l'action demandée. Cela fait donc un accès fichier.

    Bon je sais que cela peut être négligeable comme cout vu que j'aurai une class (fichier php) par action qui regroupe tous les formulaires d'une action. (Exemple : création de profil) Donc c'est léger mais tant que je suis à la création de mon nouveau moteur de site, je me dis que tant qu'à faire, autant voir si y a pas moyen d'économiser cela vu que c'est appeler à chaque requêtes.

    Il s'agit donc de fichier contenant des définitions de class, je ne sais pas si eval fonctionne avec ça.

    Je suis dans l'optique de faire un moteur très léger et j'avais donc penser mettre le contenu de ces fichiers contenant une classe de validation en cache.

    Autre piste : Est il possible de mettre des fichiers php dans une dll ou un truc de ce genre qui serait donc lancé au démarrage du serveur. Je suppose que là tout ce trouve en mémoire et donc pas besoin que je gère cela. Mais quel est l'impact de cela sur le code ? Plus besoin de require et accès au class directement ?

    J'ai également des class appelée utils et qui contient différent outils Le système pourrait également y être appliqué.

  4. #4
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Alors pour la validation, tu peux simplement faire des fonctions ou des classes que tu integrera par défaut dans tes pages (include, require) et tu les appelera avec la methode call_user_func()

    Il n'y a pas de dll en php ^^ les pages que tu inclu, elles le sont dynamiquement pas moyen de le faire "automatiquement sur le serveur" tu dois l'inscrire dans tes fichiers php.

    A la limite, si ce sont des classes et que tu es en php5, renseigne toi sur la fonction __autoload($className)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    En fait j'ai pas vrai de page mais plustot des fichiers PHP qui contiennent chacun une class. Je suis en full OO genre MVC.

    Quand tu dis qu'il n'y a pas de dll, il n'est pas possible de creer sa propre extension à inclure via php.ini ?

  6. #6
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    euh une extension c'est pas un .php lol

    tu fait du full OO ? Tu es en php4 ou 5 ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Je suis en php5

    J'y connais rien en extension C'est codé en quoi les extensions ? Car elles donnent pourtant accès à des fonctions utilisables en php pourtant ce qui le but recherché.

    Les extensions sont chargée au lancement du serveur donc acceder à une fonction venant d'un fichier php ou venant d'une extension sera plus performant via l'extension puisque tout est déja chargé en mémoire si je ne m'abuse.

    Donc je pourrais très bien mettre mes fonctions de validation et classe outil dans une extension.

    Je suppose qu'une extension est précompilée et pour info j'ai des extensions en *.dll Je ne vois pas ce qui peut m'empecher de faire mes propres extensions ?

  8. #8
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 215
    Points : 151
    Points
    151
    Par défaut
    Je sais pas si ca peux t'aider maisdans le php.ini si tu met dans le include_path le chemin de tes fichiers tu peux les utiliser sans faire de include

  9. #9
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    include_path te permet juste de faire include('nomdufichier') meme si il n'est pas dans le meme dossier que ton programme actuel du moment qu'il se trouve dans un des dossier du include_path.

    Puisque tu es sous php5, renseigne toi sur la fonction __autoload de php5. Elle te permettra que php chargera tout seul les classes que tu appel. Par contre, ça ne marche pas pour les interfaces.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Meric beaucoup,

    Je me suis renseigné sur eval()

    to load a php file to a variable then execute it, try this

    <?php
    $code=file_get_contents("file.php");
    $code=str_replace('<'.'?php','<'.'?',$code);
    $code='?'.'>'.trim($code).'<'.'?';
    eval($code);
    ?>

    using < ?php within eval does not work, but < ? does. in case there is html in the file loaded, the script doesn't remove the < ?php and ? >, but insted adds ? > and < ? around the code loaded from the file. it's simple and works very well. I also broke up the tags in the 3rd and 4th lines of code to keep from having problems if the lines are commented out.
    C'est plus ou moins ça que je veux faire. Reste à savoir si lorsque je définit une class dans un eval, celle-ci sera bien déclarée et utilisable par la suite.

    Il faut également voir les performances. Mon eval va juste déclarer la class mais l'execution se fera en dehors de l'eval. L'eval servant juste à économiser un accès disque (pour le cas de la validation). Mais si cela fonctionne pourquoi ne pas l'étendre à d'autres classes. Si une requête demande 10-15 accès disques et que je peux dimininuer cela à 5. Ca ferait pas mal d'accès disque économiser. Mais d'un autre côté avec l'avènement des SSD et leur temps d'accès < à la milliseconde, es-ce vraiment utile ?

    __autoload : Je ne connaissais pas mais si je comprends bien ça automatise le require_once ou include mais cela conserve l'accès disque lors de la lecture du fichier php contenant la class.

    Merci pour l'aide, pour le moment je m'occupe de la gestion du multi pays et multi langue du site mais ensuite je m'occuperai de ces fameuses class de validation automatique. Je ferai un pti bench pour comparer les différences et vous communiquerai les résultats. Si je gagne 20% en mettant ces class et fonctions en cache, je serai content.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Quelques nouvelles !


    Je viens de tester la combinaison d'autoload, eval et mon système de cache et... ça marche.

    Une définition d'une class dans un eval fonctionne donc. Je me suis même amusé a créer des class avec code dynamique en fonction du nom de la class demandé.

    $boulette=new boulette();
    $boulette->afficher();

    Donnera "La class est boulette"

    Bon il me reste à mettre tout cela au propre et de créer un index des class que je veux mettre en cache.

    J'aurai donc en cache un tableau contenant toutes mes class indexée par leur nom et une variable eval contenant la définition de la class et l'adresse du fichier physique ou se trouve cette finition.

    Dans ma fonction autload($name), il me suffit donc de prendre l'élement du tableau classIndex[$name] et si il existe bien faire un eval de classIndex[$name]['eval']

    J'aime comme un plan marche comme sur des roulettes

    Résultats:
    • Fini les require_once dans mon code
    • Fini les accès disque à chaque déclaration de class


    Bon au boulot pour terminer cela

    Je vous informe du suivit de la chose !

  12. #12
    Expert éminent sénior

    Avatar de Deepin
    Homme Profil pro
    Ingénieur - Chef de projet Modélisation/Simulation
    Inscrit en
    Avril 2004
    Messages
    3 164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Ingénieur - Chef de projet Modélisation/Simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 164
    Points : 51 026
    Points
    51 026
    Par défaut
    salut,
    c'est clair __autoload() pour moi c'est la grande "class" Seulement disponible en php5 mais tu dois configurer la fonction. http://www.phptutorial.info/?language.oop5.autoload
    hehe fini les require_once a chaque debut de fichier.
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 31/08/2006, 15h31
  2. Réponses: 1
    Dernier message: 02/06/2006, 21h18
  3. vérifier un fichier à partir d'une variable
    Par pharaonline dans le forum Langage
    Réponses: 5
    Dernier message: 28/05/2006, 20h51
  4. [Système] D'un textarea à une variable
    Par Peuplarchiste dans le forum Langage
    Réponses: 5
    Dernier message: 14/05/2006, 18h41
  5. Exécuter une requête à partir d'une variable
    Par Poussy-Puce dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/03/2006, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo